相关疑难解决方法(0)

什么时候在 C++ 中替换默认模板参数?

由于 C++ 中的每个 lambda 函数都有自己的类型,并且 lambda 函数的类型可以用作模板参数的默认值,因此知道该类型在模板中的哪个时刻被替换是很有趣的。考虑一个 C++20 程序示例:

#include <concepts>

template<typename T = decltype([]{})>
using X = T;

template<typename T = X<>>
auto foo() { return T{}; }

int main() {
    using T1 = decltype(foo());
    using T2 = decltype(foo());
    static_assert(!std::same_as<T1, T2>);
}

Run Code Online (Sandbox Code Playgroud)

这里类型别名定义中模板参数的默认类型X是 lambda 函数的类型 decltype([]{})。模板函数调用foo()返回该类型的值。

如果foo()程序中每次都出现新 lambda 类型的替换,则类型T1和T2必须是不同的,因为程序在static_assert. 并且此检查仅在 GCC 中通过。

在 Clang 和 MSVC 中,类型T1和T2是相同的,这意味着默认类型的替换不是每次都发生(而是在模板声明期间发生一次)。演示:https : //gcc.godbolt.org/z/dzYjf9r3q

根据标准,哪个编译器就在这里?

c++ lambda language-lawyer default-arguments c++20

9
推荐指数
1
解决办法
105
查看次数

无捕获的 lambda 是结构类型吗?

C++20 接受的P1907R1引入了结构类型,这是非类型模板参数的有效类型。

GCC 和 Clang 都接受以下 C++2a 代码片段:

template<auto v>
constexpr auto identity_v = v;

constexpr auto l1 = [](){};
constexpr auto l2 = identity_v<l1>; 
Run Code Online (Sandbox Code Playgroud)

暗示无捕获 lambda 的类型是结构类型。

题

  • 无捕获 lambda 确实满足其类型成为结构类型的要求吗?

c++ lambda templates language-lawyer c++20

7
推荐指数
2
解决办法
183
查看次数