【发布时间】:2017-12-19 21:17:17
【问题描述】:
#include <iostream>
int foo(int x) {
if constexpr (std::is_same_v<decltype(x), std::string>) {
x = std::string();
}
}
int main(void)
{ return 0; }
此代码无法在 GCC 7 和 Clang 5 上编译:
error: cannot convert ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘int’ in assignment
x = std::string();
由于引用的行在 constexpr if 分支中,应该评估为 false,程序不应该编译正常吗?
【问题讨论】:
-
这是预期的行为,令人惊讶。
if constexpr不能以这种方式工作,仅(大致)用于模板参数 -
我同意你的看法。我不明白为什么你写的代码没有指定工作。我觉得很奇怪。当然在某些情况下它是可取的,例如构建设置或特定于目标的设置
-
@Justin 您认为将
string分配给int不起作用令人惊讶吗?我很想看到这样的用例...... -
@Barry 我想如果我真的想通了,是的,这在任何情况下都是一个错误。但是有几个
if constexpr的案例并没有达到我的预期,除非我弄错了。我想得越多,我就越觉得在那些情况下我没有考虑清楚......
标签: c++ c++17 if-constexpr