c++ - 引用文献未给出预期结果

标签 c++

如果我运行下面的代码,它会输出,

key: 3, value: 4
key: 32767, value: 1971892984

我错误地创建了这个例子,我知道我的 KV 类不应该在它的成员变量中存储引用。但我无法解释这个结果。

我本以为key_value_i 的别名和 j在堆栈上。所以当传递给 cout << first 时它们应该仍然有效因为他们还没有从堆栈中取出。但我什至猜不出输出会有所不同的原因。这是我看到的特定于实现的细节吗?还是这里有更深层次的东西需要理解?

#include <iostream>

using namespace std;

template <typename K, typename V>
class KV {
public:
    KV(): key_(), value_() {}
    KV(K& key, V& value): key_(key), value_(value) {}

    K key() const { return key_; }
    V value() const { return value_; }


private:
    K& key_;
    V& value_;
};

template <typename T, typename U>
ostream& operator<<(std::ostream &strm, const KV<T, U> &a) {
    cout << "key: " << a.key() << ", value: " << a.value() << endl;
    strm << "key: " << a.key() << ", value: " << a.value() << endl;
}

template <typename T, class U>
KV<T, U> make_kv(T t, U u) {
    KV<T,U> kv(t, u);
    return kv;
}

int main() {
    int i = 3, j = 4;
    KV<int, int> first = make_kv(i, j);
    cout << first;

    return 0;
}

最佳答案

您有悬空引用,因此存在未定义的行为。原因是你在make_kv中存储的引用是对局部对象的引用,其范围是函数本身:

template <typename T, class U>
KV<T, U> make_kv(T t, U u) {
    KV<T,U> kv(t, u);
    return kv;
}  // t, u end here!!!

您可以通过修改 make_kv 来引用来解决这个问题:

template <typename T, class U>
KV<T, U> make_kv(T& t, U& u) {
    KV<T,U> kv(t, u);
    return kv;
}

注意:您必须确保了解持有引用的类型的复制和赋值语义。使引用 const 以限制意外行为的范围可能是一个想法。

关于c++ - 引用文献未给出预期结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29383544/

相关文章:

C++ - 如何获取特定用户的桌面路径

c++ - 在 Win32 中验证 SSL 证书的正确方法是什么?

c++ - array<System::String ^> 标准 C++ 是怎样的?

c++ - OS X 上的链接器错误 "ld: framework not found SFML"

php - PHP 的 WxStyledTextCtrl 代码折叠

c++ - 使用 glTextCoordPointer 贴花纹理

c++ - std::generate 不适用于 std::vector

c++ - C++中解析数组索引表达式的正则表达式

c++ - 定义多个派生接口(interface)成员

c++ - 将值插入到 vector<entry> 的映射中