初始化列表引用类型安全

时间:2015-03-14 17:50:35

标签: c++ compiler-errors runtime-error 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;
}

似乎VectorWrap2的引用成员正在被构造函数的非引用参数初始化而没有发生任何转换。

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

1 个答案:

答案 0 :(得分:5)

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

那说,什么样的转换&#34;你期待发生吗?我不确定我理解你的那部分问题。