初始化列表引用类型安全
Initializer list reference type safety
下面是一些我希望打印 "Hello world" 两次的测试代码。事实上,它打印一次 "Hello world" 然后抛出一个 Access Exception
。
打印这两条消息的代码几乎相同:
#include <iostream>
#include <vector>
using namespace::std;
class VectorWrap1 {
public:
vector<string>& v;
// *** Reference parameter ***
VectorWrap1(vector<string>& v_) : v(v_) {}
};
class VectorWrap2 {
public:
vector<string>& v;
// *** Non-reference parameter ***
VectorWrap2(vector<string> v_) : v(v_) {}
};
int main(){
vector<string> v = { "Hello world" };
VectorWrap1 w1(v);
// ***** Prints "Hello world" *********
cout << w1.v[0].c_str() << endl;
VectorWrap2 w2(v);
// ***** Throws access exception *****
cout << w2.v[0].c_str() << endl;
return 0;
}
好像 VectorWrap2 的引用成员是由构造函数的非引用参数初始化的,没有进行任何转换。
这不会产生编译时错误吗?
VectorWrap2
的构造函数将 v
设置为对调用构造函数时创建的临时 vector
的引用。该字符串在调用后被销毁,然后 w2.v[0] 引用不再存在的内容。正如@dyp 指出的那样,这肯定会产生警告。
也就是说,您希望 "conversion" 发生什么样的事情?我不确定我是否理解你问题的那一部分。
下面是一些我希望打印 "Hello world" 两次的测试代码。事实上,它打印一次 "Hello world" 然后抛出一个 Access Exception
。
打印这两条消息的代码几乎相同:
#include <iostream>
#include <vector>
using namespace::std;
class VectorWrap1 {
public:
vector<string>& v;
// *** Reference parameter ***
VectorWrap1(vector<string>& v_) : v(v_) {}
};
class VectorWrap2 {
public:
vector<string>& v;
// *** Non-reference parameter ***
VectorWrap2(vector<string> v_) : v(v_) {}
};
int main(){
vector<string> v = { "Hello world" };
VectorWrap1 w1(v);
// ***** Prints "Hello world" *********
cout << w1.v[0].c_str() << endl;
VectorWrap2 w2(v);
// ***** Throws access exception *****
cout << w2.v[0].c_str() << endl;
return 0;
}
好像 VectorWrap2 的引用成员是由构造函数的非引用参数初始化的,没有进行任何转换。
这不会产生编译时错误吗?
VectorWrap2
的构造函数将 v
设置为对调用构造函数时创建的临时 vector
的引用。该字符串在调用后被销毁,然后 w2.v[0] 引用不再存在的内容。正如@dyp 指出的那样,这肯定会产生警告。
也就是说,您希望 "conversion" 发生什么样的事情?我不确定我是否理解你问题的那一部分。