我很惊讶地看到以下编译:
struct C {
operator C&&() {
std::cerr << "ref'd\n";
throw std::runtime_error("what is happening?");
}
};
具有运算符的类型,用于其自身的rvalue-reference转换。但是,我无法使用我认为可以执行的操作来调用操作符。将值传递给采用右值引用的函数失败,并且在对象上调用std::move
不会触发任何内容。
为什么这段代码完全可以编译,有没有办法让这个函数真正运行?
clang为warning: conversion function converting 'C' to itself will never be used
提供或不提供关于类型的引用。
答案 0 :(得分:12)
struct C
{
operator C()
{
}
};
也被允许并给出相同的警告。它在§12.3.2/ 1中提到:
转换函数永远不会用于转换(可能是 cv-qualified)对象(可能是cv-qualified)相同的对象类型 (或对它的引用),对(可能是cv认证的)基类 该类型(或对它的引用),或(可能是cv-qualified)void。
换句话说,它不被禁止,但它根本不做任何事情。 Yakk和Wintermute已经展示了成员函数调用语法的示例,但cppreference显示了脚注116(N3337,N4140中的脚注118)中提到的虚拟调度示例:
struct D;
struct B {
virtual operator D() = 0;
};
struct D : B
{
operator D() override { return D(); }
};
int main()
{
D obj;
D obj2 = obj; // does not call D::operator D()
B& br = obj;
D obj3 = br; // calls D::operator D() through virtual dispatch
}
答案 1 :(得分:3)
void foo(C&&){}
int main(){
C c;
foo(c.operator C&&());
}
所以,基本没用,但不完全。