为什么代码会发出错误?
int main()
{
//test code
typedef int& Ref_to_int;
const Ref_to_int ref = 10;
}
错误是:
错误:从'int'类型的临时表中初始化'int&'类型的非const引用
我阅读prolonging the lifetime of temporaries上的帖子,其中说临时文本可以绑定到const的引用。那为什么我的代码没有被编译?
答案 0 :(得分:4)
此处ref
的类型实际上是reference to int
而不是const reference to int
。 const限定符被忽略。
$ 8.3.2说
除非通过使用typedef(7.1.3)或模板类型参数(14.3)引入cv限定符,否则Cv限定引用的格式不正确,在这种情况下,cv限定符将被忽略。
const Ref_to_int ref;
相当于int& const ref;
而不是const int& ref
。
答案 1 :(得分:1)
将const
与typedef混合在一起并不像你想象的那样;有关详情,请参阅this question。这两行是等价的:
const Ref_to_int ref;
int& const ref;
您正在寻找:
const int& ref;
修复它的一种方法是将它包含在typedef本身中(尽管你应该重命名它):
typedef const int& Ref_to_int;
答案 2 :(得分:0)
您无法向typedef
添加其他说明符。它不像宏一样工作。
您的代码实际上是
int& const ref = 10; // error
无效。