副本初始化的默认模板参数推导
Default template argument deduction for copy initialization
C++17 具有类模板参数推导。但是,我想知道它是否适用于像auto x = X()
这样的语句,其中X
是一个类模板。请考虑以下代码:
template <typename T = void>
struct X {};
int main() { // all with -std=c++17
X<> x0; // compiles in both clang and gcc
X x1; // compiles in both clang and gcc
auto x2 = X(); // compiles in clang but not gcc
X<> x3 = X(); // compiles in clang but not gcc
}
这是神螺栓链接。那么哪个编译器是正确的,这个程序是否有效C++17?
这是GCC中的一个错误。
请注意,如果将括号替换为大括号,代码将编译:
auto x2 = X{}; // now compiles in clang and gcc
X<> x3 = X{}; // now compiles in clang and gcc
这不是类模板参数推导,因为没有推导模板参数。类模板参数推导应允许省略模板大括号。在这种情况下,使用()
或{}
不应与是否推断
相关文章:
- C++转换参数初始化问题
- 在构造函数中使用可变参数初始化 std::tuple
- 类模板专用化演绎是否应该考虑演绎指南参数初始化?
- 如何通过参数初始化构造函数中的数组?
- 在模板类中使用"this"会导致参数初始化错误
- 如何使用一些参数初始化动态分配的数组中的对象
- 使用模板参数初始化静态 const 成员
- 基于模板参数初始化静态字符
- 使用参数初始化
- 使用参数包参数初始化"std::array"
- 从按值构造函数参数初始化的引用成员
- 使用派生的[C++]生成的参数初始化基类
- 一个C++默认参数可以用另一个参数初始化吗
- 如何用功能指针作为参数初始化静态成员的模板
- 用参数初始化另一类构造函数中的对象
- C :如何通过其构造函数的参数初始化类内部矩阵的尺寸
- C++:基于构造函数参数初始化向量
- 正在使用模板参数初始化stl类
- 如果类 A 修改其构造参数,我可以使用常量参数初始化 const A 吗?
- 使用结构非类型可变参数模板参数初始化结构的字符串数据成员