面试官向我展示了这样的代码,并问我是否会编译,并给出我的推理.我告诉他非常肯定它不会编译,因为10是一个常量,你不能给非const引用赋一个常量(比如int&b = 10也不会编译),同样,_a是一个临时变量,它也是再考虑const,你不能使用非const引用来引用const变量.
然而,在我惊讶地回到家后,我发现它与所有可能的编译器完美编译.而且,我没有得到这份工作.我理解的哪一部分出了问题?
class A {
int& a;
public:
A(int _a):a(_a) {}
};
int main() {
A a(10);
}
Run Code Online (Sandbox Code Playgroud)
Yah*_*hia 27
这段代码没有const的"赋值"......
代码调用构造函数,该构造函数接受int并依次调用该函数的初始化函数int&.当你认为它int& b = 10更像时,你跳过编译器看到/采取的几个步骤_a = 10; int& a = _a;.它编译但是你想要使用什么都没有(绑定对堆栈的引用,以后会导致未定义的行为/损坏)...
Pup*_*ppy 12
_a是一个临时变量,它也被认为是const,
错误.在构造函数体和初始化列表的范围内,它根本不是临时的.它是一个左值和函数参数 - 它超出了你对单个用途的所有功能.
另外,rvalues与const彼此完全无关,除了在C++ 03中你不能将非const引用绑定到rvalues.例如,您可以在rvalues上调用大量非const函数.
这段代码直接相当于
int main() {
int i = 10;
int& x = i;
}
Run Code Online (Sandbox Code Playgroud)
随着它在课堂上所涉及的终身问题的增加乐趣.
| 归档时间: |
|
| 查看次数: |
881 次 |
| 最近记录: |