什么时候在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>);
}
这里类型别名定义中模板参数的默认类型X是 lambda 函数的类型 decltype([]{})。模板函数调用foo()返回该类型的值。
如果foo()程序中每次都出现新 lambda 类型的替换,则类型T1和T2必须是不同的,因为程序在static_assert. 并且此检查仅在 GCC 中通过。
在 Clang 和 MSVC 中,类型T1和T2是相同的,这意味着默认类型的替换不是每次都发生(而是在模板声明期间发生一次)。演示:https : //gcc.godbolt.org/z/dzYjf9r3q
根据标准,哪个编译器就在这里?