我今天遇到了一个有趣的问题。考虑以下简单示例:
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期望太多,无法处理此案?还是出于某种原因我不应该这样做?
const int kConst = 1;
得到相同的结果。另外,很少有理由(我想不到的)让函数采用类型的参数const int &
-只需在int
此处使用。