关于 C++17 中尾随 return 类型的问题
Question about trailing return type in C++17
我有以下一段代码可以正常编译:
template <typename T>
struct A {T t;};
template <typename T> // 1
A(T) -> A<T>; // function template declaration with trailing return type compiles fine.
但同一函数声明的以下变体无法编译:
template <typename T> // 2
auto A(T) -> A<T>; // error: redefinition of 'A' as different kind of symbol
template <typename T> // 3
A<T> A(T); // error: redefinition of 'A' as different kind of symbol
请帮助我理解那些没有编译的原因
// function template declaration with trailing return type compiles fine.
template <typename T> // 1
A(T) -> A<T>; // function template declaration with trailing return type compiles fine.
不完全是。
对于带有显式尾随 return 类型的函数声明,您必须在函数名称前添加 auto
。
您的“1”代码示例是新的 C++17 用户定义推导指南(有关详细信息,请参阅 this page)。
给定您的模板 A
class,您是在告诉编译器当您按如下方式定义变量时
A a{42l};
你正在定义一个 A<long>
变量,因为模板参数的类型是从构造函数的参数推导出来的 (42l
)。
关于以下代码
template <typename T> // 2
auto A(T) -> A(T); // error: use of class template 'A' requires template arguments
现在你在名称前正确使用了 auto
,所以你声明了一个函数;不幸的是,名称不能是 A
(它是结构的名称)并且 return 类型不能是 A(T)
(可能是 A<T>
)
template <typename T> // 3
A<T> A(T); // error: redefinition of 'A' as different kind of symbol
现在你正确地声明了一个模板函数 returning 一个 A<T>
但仍然存在另一个问题:名称不能是 A
(它是结构的名称)
我有以下一段代码可以正常编译:
template <typename T>
struct A {T t;};
template <typename T> // 1
A(T) -> A<T>; // function template declaration with trailing return type compiles fine.
但同一函数声明的以下变体无法编译:
template <typename T> // 2
auto A(T) -> A<T>; // error: redefinition of 'A' as different kind of symbol
template <typename T> // 3
A<T> A(T); // error: redefinition of 'A' as different kind of symbol
请帮助我理解那些没有编译的原因
// function template declaration with trailing return type compiles fine.
template <typename T> // 1
A(T) -> A<T>; // function template declaration with trailing return type compiles fine.
不完全是。
对于带有显式尾随 return 类型的函数声明,您必须在函数名称前添加 auto
。
您的“1”代码示例是新的 C++17 用户定义推导指南(有关详细信息,请参阅 this page)。
给定您的模板 A
class,您是在告诉编译器当您按如下方式定义变量时
A a{42l};
你正在定义一个 A<long>
变量,因为模板参数的类型是从构造函数的参数推导出来的 (42l
)。
关于以下代码
template <typename T> // 2
auto A(T) -> A(T); // error: use of class template 'A' requires template arguments
现在你在名称前正确使用了 auto
,所以你声明了一个函数;不幸的是,名称不能是 A
(它是结构的名称)并且 return 类型不能是 A(T)
(可能是 A<T>
)
template <typename T> // 3
A<T> A(T); // error: redefinition of 'A' as different kind of symbol
现在你正确地声明了一个模板函数 returning 一个 A<T>
但仍然存在另一个问题:名称不能是 A
(它是结构的名称)