如果我运行下面的代码,它会输出,
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/