c++ - 为什么会这样编译?期待 "cannot assign a constant to a n

面试官给我看了这样的代码,问我是否可以编译,并给出我的推理。我非常肯定地告诉他它不会编译,因为 10 是一个常量,你不能将一个常量分配给一个非常量引用(比如 int& b = 10 不会编译),而且,_a 是一个临时变量,它也是再次考虑 const,您不能使用非 const 引用来引用 const 变量。

然而,当我回到家后,我惊讶地发现它可以完美地与所有可能的编译器一起编译。另外,我没有得到这份工作。我的哪一部分理解错了?

class A {
    int& a;
public:
    A(int _a):a(_a) {}
};

int main() {
    A a(10);
}    

最佳答案

此代码没有“分配” const...

代码调用带有 int 的构造函数,然后调用 int& 的初始化程序。当您假设它意味着 int& b = 10 而它更像 _a = 10; 时,您跳过了编译器看到/采取的几个步骤。 int& a = _a;.它可以编译,但绝对不是您想要使用的(绑定(bind)对堆栈的引用,稍后将导致未定义的行为/损坏)...

关于c++ - 为什么会这样编译?期待 "cannot assign a constant to a non-const reference",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7975825/

相关文章:

c++ - 为什么在传递给另一个对象时调用 const 对象上的 std::move 会调用复制构造

c++ - C++ 类接口(interface)类的析构函数

c++ - range-for循环中的访问索引

c++ - 在创建派生类对象时将参数传递给基类构造函数

c++ - 动态数组上基于范围的for循环?

c++ - 我可以使用基于范围的 for 循环轻松迭代 map 的值吗?

c++ - 如何将 long 移位超过 32 位?

c++ - `typedef typename Foo::Bar Bar'的模板声明

c++ - c.中EOF的ascii值是多少?

c++ - .o、.a 和 .so 文件有什么区别?