gpt4 book ai didi

c++ - emplace 中的危险隐式转换

转载 作者:可可西里 更新时间:2023-11-01 18:15:43 26 4
gpt4 key购买 nike

以下代码使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com