【问题标题】:Constexpr if with non-template types如果使用非模板类型,则为 Consexpr
【发布时间】: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 不能以这种方式工作,仅(大致)用于模板参数
  • thisthis
  • 我同意你的看法。我不明白为什么你写的代码没有指定工作。我觉得很奇怪。当然在某些情况下它是可取的,例如构建设置或特定于目标的设置
  • @Justin 您认为将string 分配给int 不起作用令人惊讶吗?我很想看到这样的用例......
  • @Barry 我想如果我真的想通了,是的,这在任何情况下都是一个错误。但是有几个if constexpr 的案例并没有达到我的预期,除非我弄错了。我想得越多,我就越觉得在那些情况下我没有考虑清楚......

标签: c++ c++17 if-constexpr


【解决方案1】:

if constexpr 规范定义了丢弃的语句。然后它继续定义当结果不是值相关的实例化之后不实例化被丢弃的语句。这意味着在模板实例化期间语句被丢弃。此外,仅当条件值依赖于模板参数时,该语句才会被丢弃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多