【发布时间】:2022-01-17 16:27:06
【问题描述】:
我有一个带有返回值的函数的类。由于复杂的原因,需要将该值作为const 引用返回。
(最小的工作示例包含一个int 数组,实际代码有更复杂的对象,因此参考)
class Foo
{
public:
static constexpr const int OUT_OF_BOUNDS_VALUE = -9999;
const int& ret(int i) const { return i < 0 || i > 4 ? OUT_OF_BOUNDS_VALUE : test[i]; }
private:
int test[5] = {0, 1, 2, 3, 4};
};
这在 VS2015 中给了我warning C4172: returning address of local variable or temporary,它甚至不能用 GCC 编译。
- 在
Foo之外添加行constexpr const int Foo::OUT_OF_BOUNDS;可以让GCC 编译得很好。 VS2015 仍然给出警告。 - 删除
constexpr并从定义中拆分声明可修复警告,但我为什么必须这样做?
OUT_OF_BOUNDS 不是本地的,也不是临时的,对吧?在类定义里面定义和声明的时候没有地址吗?
【问题讨论】:
-
无论如何,无法复制:godbolt.org/z/e5KoKGbdW。您使用的是哪个 gcc 版本?
-
@463035818_is_not_a_number 如问题所述,这是一个 MWE,真正的代码甚至与整数无关。另外:我正在使用 GCC 9.0.1(在 WSL 上)
-
使用 clang、gcc 和 MSVC 编译良好 - 实时 - godbolt.org/z/8r5nM5sha - 请检查您的 minimal reproducible example
-
使用 MSVC 编译时带有警告 - live godbolt.org/z/r69abn3rG
-
确实。它看起来像一个神螺栓错误,它用 gcc 替换了 msvc 窗格。自己把编译器改成msvc。或者试试this link,希望能成功。
标签: c++ c++11 static constexpr