使用g ++,这是一个法律声明:
class foo
{
public:
foo();
&operator int(); // this fails with Clang
};
这是我的真实代码的简化示例,看起来更像
template <class VAR_TYPE> class Foo : public Bar<VAR_TYPE>
{
public:
Foo();
// [...] more constructors here
&operator const VAR_TYPE () const; // this fails with Clang
// [...] more stuff (a lot)
};
尝试使用Clang编译它会产生以下错误:
错误:无法在声明中指定返回类型的任何部分 转换功能;将完整类型放在&#39;运算符&#39;
之后
我发现GCC使用&
这里的论据是被禁止的,因为它违反了语言定义12.3.2.1
[...]无法指定返回类型。如果转换函数是a 成员函数,转换函数的类型(8.3.5)是 “函数不带参数返回conversion-type-id”。 [...]
问题1。
GCC实施究竟做了什么?从我的测试来看,我怀疑它等同于operator int& ();
,但如果我错了或者我错过了一些额外的功能,请纠正我。
问题2。
在我的(遗留)代码中,它实际上是&operator const VAR_TYPE() const;
。鉴于我在问题1中的假设是正确的,这相当于operator const VAR_TYPE&() const;
。什么可能是返回const引用而不是非引用副本的目的,并且可以某种方式利用它来对像数组/向量元素这样的底层数据结构进行写访问?
问题3。
语言定义这真的是非法的吗?引用的文本仅涉及返回类型。 &
不是一种类型。它是一个词法元素,需要与普通的类型说明符组合才能成为一种类型。但我无法在语言定义中找到&
的广泛解释。