And*_*coy 2 c++ runtime-error compiler-errors pass-by-reference
下面是我希望两次打印"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;
}
Run Code Online (Sandbox Code Playgroud)
看起来好像VectorWrap2的引用成员是由构造函数的非引用参数初始化而没有发生任何转换.
这不应该生成编译时错误吗?
VectorWrap2的构造函数设置v为在vector调用构造函数时创建的临时引用.调用后该字符串被销毁,然后w2.v [0]引用不再存在的内容.正如@dyp指出的那样,这肯定会产生警告.
那就是说,你期待发生什么样的"转换"?我不确定我理解你的那部分问题.