【发布时间】:2018-05-08 09:52:59
【问题描述】:
今天我看到在函数调用中尝试取消引用参数时,隐式转换发生在实际取消引用操作之前(我相信只有在原始类型不支持取消引用的情况下)。
这个观察可以在这里看到:
struct A{};
struct C
{
C(const A&)
{
}
};
C operator*(const C&);
double f(C);
template <typename T>
struct t
{
static const bool value = sizeof(f(**static_cast<T*>(NULL))) == sizeof(double);
};
int main(int argc, const char * argv[]) {
t<A>::value;
}
C++ 标准是否明确提到了这种行为?谢谢。
【问题讨论】:
-
This implicit conversion references 列出“当表达式用作操作数时,带有需要 T2 的运算符”。在您的情况下,
T1是A,T2是C。您对A对象执行一元解引用运算符,没有定义这样的运算符,但是C有一个可以将A类型转换为的运算符。然后使用一元解引用运算符。 -
请解释如何在那里看到它,因为该程序没有可观察到的行为。
-
@molbdnilo 如果没有发生转换,代码将给出诊断(没有匹配的
f重载) -
@Someprogrammerdude 好的,所以发生在函数调用中的事实没有相关性,对吗?
-
函数调用是一个红鲱鱼。在
**static_cast<T*>(NULL)中,您基本上拥有A a; *a;使*a编译的唯一方法是operator*(C(a))
标签: c++ language-lawyer implicit-conversion dereference