【发布时间】:2016-07-14 03:42:02
【问题描述】:
为什么我的 const ref 在这段代码中变得无效以及如何避免这种情况?我无法复制,这是我的应用程序的瓶颈。
class Foo {
public:
const std::string& string() const {
return string;
}
private:
std::string string = "asdf";
};
Foo foo;
std::vector<std::pair<const std::string&, int>> invalid;
for (int i = 0; i < 5; i++) {
invalid.emplace_back(std::make_pair(foo.string(), i);
// after this line invalid[i].first is invalid
}
【问题讨论】:
-
模板参数推导的工作方式是
make_pair在您的调用中返回std::pair<std::string, int>;然后emplace构造std::pair<const std::string&, int>。所以引用绑定到临时对的成员,而不是foo.string。让它invalid.emplace_back(std::pair<const std::string&, int>(foo.string(), i)); -
你怎么知道
invalid[i].first无效?Foo不能使用移动构造函数赋值。这对于矢量元素是否合法? (真正的问题 - 我还没有完全赶上 C++11。)如果您使用std::pair<const std::string*, int>作为元素类型,它是否有效? -
@IgorTandetnik - 把它作为一个答案,这样我就可以投票了!
-
invalid.emplace_back(foo.string(), i)。构造对是多余的,而且你也做错了。 -
在发布之前测试您的代码。
标签: c++ reference invalidation