作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
以下代码使用 gcc 6.3 ( https://godbolt.org/g/sVZ8OH ) 编译时没有任何错误/警告,但由于下面标记的无效内存访问,它包含危险的未定义行为。根本原因是在 emplace_back 中执行的隐式转换。谁能提出避免此类代码错误的好方法或最佳做法?
#include <iostream>
#include <vector>
struct Foo
{
explicit Foo(const int& i) : i{i} {}
void foo() const { std::cout << i; } // invalid memory access, as i is an invalid ref!!
const int& i;
};
void bar(const double& d) {
std::vector<Foo> fv;
fv.emplace_back(d);
}
最佳答案
如果您要接受一个 const 引用,但您不想要一个临时引用,请声明一个带有右值引用参数的附加构造函数 - 并将其删除。
struct Foo
{
explicit Foo(const int& i) : i{i} {}
explicit Foo(const int&& i) = delete; // This preferentially matches a reference to a
// temporary, and compilation fails.
void foo() const { std::cout << i; } // invalid memory access, as i is an invalid ref!!
const int& i;
};
(我假设实际问题比 int 更复杂。对于 int,按值保存它是正确的答案。)
关于c++ - emplace 中的危险隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41402795/
我是一名优秀的程序员,十分优秀!