c++ - 初始化列表引用类型安全

标签 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 的引用成员是由构造函数的非引用参数初始化的,没有进行任何转换。

这不会产生编译时错误吗?

最佳答案

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

也就是说,您希望发生哪种“转换”?我不确定我是否理解你问题的那一部分。

关于c++ - 初始化列表引用类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29052199/

相关文章:

c++ - 在指向 vector 的智能指针上使用 push_back() 时出现运行时错误

c++ - 在 cpp 中使用 union 的未定义行为?

c++ - 在结构的嵌套映射上链接 operator[]

c++ - 什么样的语言特性适用于只有几行不同的类似功能?

c++ - Visual Studio 使用多线程 DLL 发布应用程序文件

java - “找不到符号”或“无法解析符号”错误是什么意思?

opencv - opencv2 HOG代码中的运行时错误SIGSEV

c++ - 编译错误 : Undeclared member that is actually declared

java - 为什么在 Java 中类型与转换的不兼容性在运行时检查,类型不匹配在编译时转换?

perl - 在 Perl 中捕获运行时错误并转换为异常