有关 C++17 中的尾随返回类型的问题
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
请帮助我理解为什么那些没有编译背后的理由
//具有尾随返回类型的函数模板声明可以很好地编译。
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
(它是结构的名称(
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 特征返回类型的 pybind11 问题
- 必须使用尾随返回类型的示例,因为无法用旧方法解决问题
- 有关 C++17 中的尾随返回类型的问题
- 我的问题是关于类成员函数作为类指针的返回类型
- C 多重继承,虚拟方法覆盖问题和协变量返回类型
- 函数返回类型名列表:<T>:迭代器有什么问题?
- 尾随返回类型中的名称查找问题
- 正常函数的返回类型推导问题
- 使用受限函数时,尾随返回类型问题
- 使用我的结构作为返回类型的问题
- C++返回类型问题