c++ - 引用成员必须是常量?

标签 c++ constructor initialization constants

在这个简单的示例中,为什么我需要将“成员”设为常量才能进行编译?

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 的初始化中使用了从 intClassA 的隐式转换.在扩展形式中,它实际上在做以下事情

member(ClassA(integer))

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

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

ClassA member;

此外,将 explicit 放在 ClassA 构造函数之前以避免静默隐式转换是一种很好的做法。

explicit ClassA(int integer){}

关于c++ - 引用成员必须是常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3637754/

相关文章:

haskell - Haskell 中的可选参数

c - 以下代码有哪些潜在问题?短 foo() { 短 a,b,c; b=10; c = a + b;返回c; }

c++ - 返回指向 std::list of pointers 的指针时出现 ImplicitCast_ 错误

c++ - Eclipse RDT (PTP) 命令未找到 "rm"

c++ - 在不使用 Arduino 中的 String 对象的情况下将二进制数据转换为其等效的 ASCII

c++ - 就地重新初始化对象

c++ - 无法修改类中的对象 vector

multithreading - 使用spring进行多线程上下文初始化?

c# - 默认发起成员(member)的结果是什么! C# .net 中的语句?

c++ - 将长度除以 sin(x) 总是会得出否定答案