【发布时间】:2013-09-26 17:46:12
【问题描述】:
这是一个使用return type deduction 进行课堂友元函数的小实验(在两种情况下都使用 Clang 3.4 SVN 和 g++ 4.8.1 和 std=c++1y),链接的工作文件中没有记录
#include <iostream>
struct A
{
int a_;
friend auto operator==(A const& L, A const& R)
{
return L.a_ == R.a_; // a_ is of type int, so should return bool
}
};
template<class T>
struct B
{
int b_;
friend auto operator==(B const& L, B const& R)
{
return L.b_ == R.b_; // b_ is of type int, so should return bool
}
};
using BI = B<int>;
int main()
{
std::cout << (A{1} == A{2}) << "\n"; // OK for Clang, ERROR for g++
std::cout << (BI{1} == BI{2}) << "\n"; // ERROR for both Clang and g++
}
问题:C++14 支持类内友元函数的自动返回类型推导吗?
【问题讨论】:
-
我不认为问题出在模板中定义的朋友函数。 Live example 有“即使函数体包含带有非类型相关操作数的返回语句,在定义被实例化时,在其声明类型中带有占位符的函数模板的返回类型推导也会发生”但我找不到关于类模板成员或类模板中定义的友元函数的任何信息。
-
因为有 [temp.friend]/4 “当一个函数在类模板中的友元函数声明中定义时,该函数在该函数被 odr-used 时实例化。”,也许是措辞在 [dcl.spec.auto]/12 中应该是“函数模板的返回类型推导,类模板的成员函数和类模板中定义的友元函数”。
-
@DyP tnx 获取这些报价。我上面链接的工作文件尚未反映在当前的标准草案中,但我发现该文件阅读起来相当混乱,并且没有类似于上述代码的示例。
-
您的示例具有误导性,错误是定义函数的位置,而不是您尝试调用它们的位置。您可以在
main()中注释掉这两行,但它仍然失败(clang trunk 甚至在operator==(const B&, const B&)上崩溃。)
标签: c++ auto c++14 return-type-deduction