初始化列表引用类型安全

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的引用成员是由构造函数的非引用参数初始化而没有发生任何转换.

这不应该生成编译时错误吗?

sfj*_*jac 5

VectorWrap2的构造函数设置v为在vector调用构造函数时创建的临时引用.调用后该字符串被销毁,然后w2.v [0]引用不再存在的内容.正如@dyp指出的那样,这肯定会产生警告.

那就是说,你期待发生什么样的"转换"?我不确定我理解你的那部分问题.