有关 C++17 中的尾随返回类型的问题

Question about trailing return type in C++17

本文关键字:返回类型 问题 有关 C++17      更新时间:2023-10-16

>我有以下一段代码可以很好地编译:

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

请帮助我理解为什么那些没有编译背后的理由

//具有尾随返回类型的函数模板声明可以很好地编译。

template <typename T> // 1 
A(T) -> A<T>;  // function template declaration with trailing return type compiles fine.

不完全是。

对于具有显式尾随返回类型的函数声明,必须在函数名称前添加auto

您的"1"代码示例是一个新的 C++17 用户定义的扣除指南(有关更多信息,请参阅此页面(。

给定你的模板A类,你说编译器当你定义一个变量时,如下所示

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(它是结构的名称(,返回类型不能A(T)(也许是A<T>(

template <typename T>  // 3
A<T> A(T); // error: redefinition of 'A' as different kind of symbol

现在你正确地声明了一个返回A<T>的模板函数,但仍然是另一个问题:名称不能A(它是结构的名称(