今天我遇到了一个有趣的问题,看看这个简单的例子:
template <typename T>
void foo(const T & a) { /* code */ }
// This would also fail
// void foo(const int & a) { /* code */ }
class Bar
{
public:
static const int kConst = 1;
void func()
{
foo(kConst); // This is the important line
}
};
int main()
{
Bar b;
b.func();
}
在编译时,我得到一个错误:
Undefined reference to 'Bar::kConst'
现在,我非常肯定这是因为 static const int
没有在任何地方定义,这是有意为之的,因为根据我的理解,编译器应该能够在编译时进行替换,而不需要定义。但是,由于该函数接受 const int &
参数,因此它似乎不进行替换,而是首选引用。我可以通过以下改变来解决这个问题:
foo(static_cast<int>(kConst));
我相信这会迫使编译器生成一个临时 int,然后传递一个对它的引用,它可以在编译时成功地做到这一点。
我想知道这是不是故意的,还是我对 GCC 期望太高,以至于无法处理这个案子?还是因为某些原因我不该这么做?