关于 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 (它是结构的名称)