在这个简单的示例中,为什么我需要将“成员”设为常量才能进行编译?
struct ClassA
{
ClassA(int integer) {}
};
struct ClassB
{
ClassB(int integer):
member(integer)
{
}
const ClassA& member;
};
int main()
{
ClassB* b = new ClassB(12);
return 0;
}
否则,我会得到这个错误:
error: invalid initialization of reference of type 'ClassA&' from expression of type 'int'
最佳答案
这里实际发生的原因是您在 member
的初始化中使用了从 int
到 ClassA
的隐式转换.在扩展形式中,它实际上在做以下事情
member(ClassA(integer))
这意味着 ClassA
实例是临时的。仅使用 const 引用来引用临时变量是不合法的,因此会出现编译器错误。
最简单的解决方法是删除成员上的 &
修饰符并使其成为类型 ClassA
ClassA member;
此外,将 explicit
放在 ClassA
构造函数之前以避免静默隐式转换是一种很好的做法。
explicit ClassA(int integer){}
关于c++ - 引用成员必须是常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3637754/