参考成员必须是Const?

Dan*_*Dan 4 c++ constructor initialization const

在这个简单的例子中,为什么我需要创建'member'const以便编译它?

struct ClassA
{
    ClassA(int integer) {}
};

struct ClassB
{
    ClassB(int integer):
        member(integer)
    {
    }

    const ClassA& member;
};

int main()
{
    ClassB* b = new ClassB(12);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

否则,我收到此错误:

错误:从类型'int'的表达式初始化类型'ClassA&'的引用无效

Jar*_*Par 10

之所以是什么实际发生在这里你正在使用从隐式转换intClassA在初始化member.在扩展形式中,它实际上正在执行以下操作

member(ClassA(integer))
Run Code Online (Sandbox Code Playgroud)

这意味着该ClassA实例是临时的.仅对const引用引用临时变量是不合法的,因此会出现编译器错误.

最简单的解决方法是删除&成员上的修饰符并使其仅为类型ClassA

ClassA member;
Run Code Online (Sandbox Code Playgroud)

另外,最好放在构造函数explicit前面ClassA以避免静默隐式转换.

explicit ClassA(int integer){}
Run Code Online (Sandbox Code Playgroud)