【发布时间】:2017-01-06 15:44:08
【问题描述】:
我正在尝试编写一个constexpr 形式的函数:
constexpr int foo(bool cond) {
int a, b, c;
if (cond) {
a = 1;
b = 2;
c = 3;
}
else {
a = -1;
b = -2;
c = -3;
}
return a + b + c;
}
然而,编译器抱怨我使用了未初始化的变量,尽管局部变量的最终初始化是有保证的。
我可以重写函数以使用三元运算符,即int a = cond ? 1 : -1; 等,但我不希望这样做。有没有办法让编译器相信局部变量会被初始化?
【问题讨论】:
-
int a = 0, b = 0, b = 0;? (no more error) (P.S: 错过了编辑窗口) -
在 C++ 中,没有“最终初始化”之类的东西。您要么初始化变量,要么不初始化。以后是否分配给他们无关紧要。 (在 C 和编译器警告“可能未初始化”是不同的。)
-
@VittorioRomeo:当您面临以下选择时:(a) 将一个“概念上错误”的分配给
int,它的运行时间成本恰好为零,也没有维护成本,以及 (b)三十行的 lambda/template/tuple 魔术示例,世界上只有三个人能理解……好吧,我知道我的团队中哪一个通过了代码审查。 :) -
@LightnessRacesinOrbit 该函数不会总是使用常量表达式参数调用,因此对 a、b 和 c 进行不必要的初始化可能会产生运行时成本。诚然,编译器可能会删除它。
-
@LightnessRacesinOrbit:我正在尽力避免这种情况!像 C++17 那样行事是永远不会被使用的魔法并没有帮助:)