为什么这样:
#include <string>
#include <iostream>
using namespace std;
class Sandbox
{
public:
Sandbox(const string& n) : member(n) {}
const string& member;
};
int main()
{
Sandbox sandbox(string("four"));
cout << "The answer is: " << sandbox.member << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给出输出:
答案是:
代替:
答案是:四
也就是说,为什么这样:
struct S {};
struct T
{
T(S& s) : s{s} {}
S& s;
};
int main()
{
S s;
T t{s};
}
Run Code Online (Sandbox Code Playgroud)
给我一个GCC 4.7的编译器错误:
test.cpp: In constructor 'T::T(S&)':
test.cpp:5:18: error: invalid initialization of non-const reference of type 'S&' from an rvalue of type '<brace-enclosed initializer list>'
Run Code Online (Sandbox Code Playgroud)
?
要修复错误,我必须更改s{s}为s(s).这不会打破统一初始化的统一性吗?
编辑:我试过clang,clang接受它,所以也许这是一个GCC错误?
以下代码如何在C++中工作?这合乎逻辑吗?
const int &ref = 9;
const int &another_ref = ref + 6;
Run Code Online (Sandbox Code Playgroud)
为什么当非const引用不允许C++时,C++允许对const引用进行文字初始化?例如:
const int days_of_week = 7;
int &dof = days_of_week; //error: non const reference to a const object
Run Code Online (Sandbox Code Playgroud)
这可以通过以下事实来解释:非const引用可用于更改它所引用的变量的值.因此,C++不允许对const变量进行非const引用.
这可能是一个可能的解释吗?C++不允许:
int &ref = 7;
Run Code Online (Sandbox Code Playgroud)
因为这不符合逻辑,但是:
const int &ref = 7;
Run Code Online (Sandbox Code Playgroud)
几乎相当于:
const int val = 7;
Run Code Online (Sandbox Code Playgroud)
因此,const变量允许进行文字初始化.
PS:我正在研究Lippman的C++入门.