当我测试过的每个 C++ 编译器编译时,以下代码会崩溃或挂起,直到内存耗尽:
#include <tuple>
template<class... Ts>
auto f(Ts... ts){
return f(std::make_tuple(ts...));
}
auto a = f();
Run Code Online (Sandbox Code Playgroud)
在各种版本的 GCC、Clang、MSVC、icc、ELLCC 上测试:https ://godbolt.org/z/cwqiZK
我的问题是为什么这不被模板深度限制或这些编译器实现的类似安全所捕获?我发现了一些代码示例,例如这个旧示例,会导致编译器挂起,但似乎我能找到的所有问题都已解决,因为它成为限制模板实例化深度的标准。
我要指出,这不是唯一的make_tuple,和工程tie,forward_as_tuple...等等。
作为警告,如果您尝试在本地编译它,请务必使用类似的方法ulimit来确保编译器不会耗尽您的内存。在玩这个时,我不得不硬重启几次。