代码之家  ›  专栏  ›  技术社区  ›  Rakete1111

默认模板参数中的lambda是否被视为即时上下文的一部分?

  •  14
  • Rakete1111  · 技术社区  · 7 年前

    下面的代码是格式正确的C++17吗?

    template <typename T, int = [](auto t) { decltype(t)::invalid; return 0; }(T{})>
    constexpr int f(T) { return 0; }
    constexpr int f(...) { return 1; }
    
    static_assert(f(0) == 1);
    

    clang和edg接受,而msvc和gcc接受 1. 拒绝它。我找不到任何东西可以说这是一个硬错误,但我也找不到任何东西可以说这是一个演绎失败。

    [temp.deduct]p9

    A. lambda表达式

    这表明lambda不是直接上下文的一部分。但是C++17呢?


    1. :gcc有一个错误 auto 在这个上下文中,但是使用lambda的显式模板参数重写它会导致相同的错误。

    1 回复  |  直到 7 年前
        1
  •  12
  •   StoryTeller - Unslander Monica    7 年前

    如果我收集的数据正确的话,它在C++17中的格式显然是不正确的。

    [expr.prim.lambda] (强调矿山)

    2 lambda表达式不应出现在未计算的操作数中, 在里面 , [...]

    [温度参数] (强调矿山)

    9 默认模板参数 是一个模板参数 在模板参数中的=之后指定的([temp.arg])。