gpt4 book ai didi

c++ - 默认模板参数中的 lambda 是否被视为直接上下文的一部分?

转载 作者:IT老高 更新时间:2023-10-28 22:39:05 26 4
gpt4 key购买 nike

以下代码是格式良好的 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 和 gcc1 拒绝它。我找不到任何可以说这是一个硬错误的东西,但我也找不到任何可以说这是一个演绎失败的东西。

在C++20中,有这样一段([temp.deduct]p9):

A lambda-expression appearing in a function type or a template parameter is not considered part of the immediate context for the purposes of template argument deduction.

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


1:gcc 在这种情况下存在 auto 的错误,但是使用 lambda 的显式模板参数重写它会得到同样的错误。

最佳答案

如果我没记错的话,它在 C++17 中的格式很明显是错误的。

[expr.prim.lambda] (emphasis mine)

2 A lambda-expression shall not appear in an unevaluated operand, in a template-argument, [...]

[temp.param] (emphasis mine)

9 A default template-argument is a template-argument ([temp.arg]) specified after = in a template-parameter.

在这两种情况下,“模板参数”都是同一个规范术语。所以我认为 Clang 和 edg 错误地接受了 OP 中的代码作为有效的 C++17。

关于c++ - 默认模板参数中的 lambda 是否被视为直接上下文的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53595159/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com