gpt4 book ai didi

c++ - 我需要把 constexpr 放在 else-if 之后吗?

转载 作者:IT老高 更新时间:2023-10-28 12:37:24 26 4
gpt4 key购买 nike

灵感来自 this answer ,我尝试复制并粘贴(并在 main() 中添加测试)此代码:

template<typename T>
std::tuple<int, double> foo(T a) {
if constexpr (std::is_same_v<int, T>)
return {a, 0.0};
else if (std::is_same_v<double, T>)
return {0, a};
else
return {0, 0.0};
}

int main() {
auto [x, y] = foo("");
std::cout << x << " " << y;
}

这很简单 - 如果 T推导出为 int ,我们要返回一个元组 [a, 0.0] .如果 T推导出为 double ,我们要返回一个元组 [0, a] .否则,我们要返回 [0, 0.0] .

如您所见,在 main()函数,我正在调用 fooconst char*参数,应该导致xy正在 0 . 情况并非如此

在尝试编译时,我遇到了一个奇怪的错误:

error: could not convert '{0, a}' from '<brace-enclosed initializer list>' to 'std::tuple<int, double>'

而我就像什么?。我到底为什么要那个...我专门用了std::is_same启用 return {0, a} 当类型为 a推导出为 double .

于是我赶紧跑到cppreference在 if-constexpr 上。在页面底部,Notes上方,我们可以看到这段代码:

extern int x; // no definition of x required
int f() {
if constexpr (true)
return 0;
else if (x)
return x;
else
return -x;
}

我心想好吧..?我真的看不出原始代码有什么问题。它们使用相同的语法和语义....

但我很好奇。我很好奇(当时)是否有一些奇怪的东西可以解决这个问题,所以我将原始代码更改为:

template<typename T>
std::tuple<int, double> foo(T a) {
if constexpr (std::is_same_v<int, T>)
return {a, 0.0};
else if constexpr (std::is_same_v<double, T>) // notice the additional constexpr here
return {0, a};
else
return {0, 0.0};
}

int main() {
auto [x, y] = foo("");
std::cout << x << " " << y;
}

然后瞧!代码按预期编译和执行。所以,我的问题是 - 我们需要输入 constexpr在每个 if 之后if-else 中的声明在这种情况下声明? 或者它只是我的编译器?我正在使用 GCC 7.3。

最佳答案

Do we need to put constexpr after every if statement in if-else block in these kind of situations?

是的。 else-if block 1 是个谎言 :),只有 if block 1 和 else block 1。这就是编译器看到你的代码的方式:

if constexpr (std::is_same_v<int, T>)
return {a, 0.0};
else // {
if (std::is_same_v<double, T>)
return {0, a};
else
return {0, 0.0};
// }

else if (/*...*/) 只是每个人都使用的格式约定。这样,您可以清楚地看到需要第二个 constexpr


1:“ block ”不是正确的术语。 if 是一个语句(带有可选的 else 部分)。一个 block 是 {/*...*/}.

关于c++ - 我需要把 constexpr 放在 else-if 之后吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52356341/

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