c++ - 我需要把 constexpr 放在 else-if 之后吗?
问题描述
受此答案的启发,我尝试复制并粘贴(并在其中添加测试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()
函数中,我foo
使用const char*
参数调用,这应该导致x
andy
是0
. 事实并非如此。
在尝试编译它时,我遇到了一个奇怪的错误:
错误: 无法将 '
{0, a}
' 从 '<brace-enclosed initializer list>
' 转换为 'std::tuple<int, double>
'
我就像什么?. 为什么我会想要那个...我专门用于仅当类型被推断为时才std::is_same
启用。return {0, a}
a
double
所以我迅速跑到if-constexpr 上的cppreference。在页面底部的Notes上方,我们可以看到这段代码:
extern int x; // no definition of x required
int f() {
if constexpr (true)
return 0;
else if (x)
return x;
else
return -x;
}
我心想oookay..?我真的看不出原始代码有什么问题。它们使用相同的语法和语义......
但我很好奇。我很好奇(当时)是否有一些奇怪的东西可以解决这个问题,所以我将原始代码更改为:
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。
解决方案
在这种情况下,我们是否需要在 if-else 块中的每个 if 语句之后放置 constexpr?
是的。else-if 块1是一个谎言 :),只有 if 块1和 else 块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:“块”不是正确的术语。if 是一个语句(带有可选的 else 部分)。一个块是{ /*...*/ }
.
推荐阅读
- python - 3D 数组中的索引列表
- c++ - 在 C++ 中使用链表对与原点的距离、x 和 y 坐标进行排序
- python - Python Selenium find_elements_by_class_name 错误
- sql - 无法批量加载。该文件不存在或您没有文件访问权限。Azure 数据工作室
- python - 如何在 python 中使用两个鼠标按下功能?
- sql - 如何在另一列中显示最大日期金额?
- java - 如何仅修复循环中的最后一个对象在 Java ArrayList 中重复
- qt - 如何将焦点设置到 ListView 委托内的 TextField?
- python - 循环不中断
- if-statement - 我可以使用 if 语句在位置之间切换吗?