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节),但由于我缺乏经验,我无法找到答案.
我非常感谢任何花时间帮助我解决这个问题的人.
查看n3337中的[expr.static.cast](标准之后的第一个工作草案):
\n\n\n2/类型为 \xe2\x80\x9ccv1
\nB,\xe2\x80\x9d 的左值,其中B是类类型,可以转换为类型 \xe2\x80\x9creference to cv2D,\xe2\x80\x9d ,其中D是派生类(第 10 条)从,如果存在从 \xe2\x80\x9cpointer 到\xe2\x80\x9d 到 \xe2\x80\x9cpointer 到\xe2\x80\x9dB的有效标准转换[...]DB4/否则,如果声明格式良好,则可以使用以下形式将表达式
\ne显式转换为类型:对于某些发明的临时变量[..]Tstatic_caststatic_cast<T>(e)T t(e);t
因此,我认为 gcc 的行为是正确的,即表达式:
\nstatic_cast<Derived const&>(*this)\nRun Code Online (Sandbox Code Playgroud)\n不应递归调用operator Derived const& () const。
我从else关键字的存在中推断出这一点,这意味着规则的排序。2/应在规则之前尝试该规则4/。