使用static_cast实现转换运算符

Mas*_*ano 7 c++ standards crtp static-cast conversion-operator

在这里提出的问题之后问这个问题.

这一点非常简单.假设你有两类这样的类:

template < class Derived >
class Base {
...
operator const Derived&() const {
    return static_cast< const Derived& >(*this);
  }
...
};

class Specialization : public Base<Specialization> {
...
};
Run Code Online (Sandbox Code Playgroud)

然后假设您有类似这样的类型转换:

template < class T >
functionCall( const Base<T>& param) {
  const T & val(param);
  ...
}
Run Code Online (Sandbox Code Playgroud)

问题是:这种转换的标准符合行为应该是什么?

它是否应该相同const T & val(static_cast<const T &> (param) )或应该递归迭代直到堆栈溢出?请注意,我获得了第一个使用GNU编译的行为g++,第二个使用Intel编译icpc.

我已经试图查看标准(关于static_cast的第5.9节和关于转换的第12.3节),但由于我缺乏经验,我无法找到答案.

我非常感谢任何花时间帮助我解决这个问题的人.

Mat*_* M. 3

查看n3337中的[expr.static.cast](标准之后的第一个工作草案):

\n
\n

2/类型为 \xe2\x80\x9ccv1 B,\xe2\x80\x9d 的左值,其中B是类类型,可以转换为类型 \xe2\x80\x9creference to cv2 D,\xe2\x80\x9d ,其中D是派生类(第 10 条)从,如果存在从 \xe2\x80\x9cpointer 到\xe2\x80\x9d 到 \xe2\x80\x9cpointer 到\xe2\x80\x9dB的有效标准转换[...]DB

\n

4/否则,如果声明格式良好,则可以使用以下形式将表达式e显式转换为类型:对于某些发明的临时变量[..]Tstatic_caststatic_cast<T>(e)T t(e);t

\n
\n

因此,我认为 gcc 的行为是正确的,即表达式:

\n
static_cast<Derived const&>(*this)\n
Run Code Online (Sandbox Code Playgroud)\n

不应递归调用operator Derived const& () const

\n

我从else关键字的存在中推断出这一点,这意味着规则的排序。2/应在规则之前尝试该规则4/

\n