c++ - 什么时候在 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
根据标准,哪个编译器在这里?
解决方案
推荐阅读
- c++ - 这两个操作在 C++ 中不是一回事吗?
- ios - XCTest 测试运行器在完成运行测试之前以代码 -1 退出
- .net-5 - 在托管服务器上时,Blazor 应用程序未运行服务器代码
- node.js - React 前端连接到我的计算机上的开发服务器,而不是 Azure VM 上的 Node 服务器,从为什么使用 localhost 托管它
- python - 从同一个python类中另一个函数中的函数访问变量
- python - Python ffmpeg 子进程制作无法播放的文件,但大小合适,只是挂起
- asp.net - 浏览到 ASP.NET 网站文件夹中的 PDF
- eclipse - 最终启动序列中的错误:无法执行 MI 命令:-exec-run
- python-3.x - 有人可以解释一下,以下代码段的输出如何为 100?
- networking - 我有一个关于流量控制数据的利用率和吞吐量以及如何找到数据包错误率的问题