首页 > 解决方案 > 什么时候在 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 类型的替换,那么类型T1T2必​​须是不同的,因为程序在static_assert. 并且此检查仅在 GCC 中通过。

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

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

标签: c++lambdalanguage-lawyerc++20default-arguments

解决方案


推荐阅读