Rak*_*111 14 c++ language-lawyer c++17
以下代码是否格式良好的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);
Run Code Online (Sandbox Code Playgroud)
clang和edg接受它,而msvc和gcc 1拒绝它.我找不到任何可以说这是一个硬错误的东西,但我也找不到任何可以说这是演绎失败的东西.
在C++ 20中,有这一段([temp.deduct] p9):
甲λ-表达出现在函数式或模板参数不被认为对模板参数推导的目的,即时上下文的一部分.
这表明lambda不是直接上下文的一部分.但是C++ 17呢?
1:gcc auto在这个上下文中有一个bug ,但是使用lambda的显式模板参数重写它会得到同样的错误.
Sto*_*ica 12
如果我正确地收集它,它在C++ 17中很简单.
[expr.prim.lambda](强调我的)
2 lambda表达式不应出现在未评估的操作数中,模板参数中,[...]
[temp.param](强调我的)
9默认模板参数是在模板参数中 =后指定的模板参数([temp.arg]).
在这两种情况下,"模板参数"都是相同的规范术语.所以我认为Clang和edg错误地认为OP中的代码是有效的C++ 17.