我惊讶地看到以下编译:
struct C {
operator C&&() {
std::cerr << "ref'd\n";
throw std::runtime_error("what is happening?");
}
};
Run Code Online (Sandbox Code Playgroud)
具有运算符的类型,用于其自身的rvalue-reference转换.但是,我无法使用我认为可以做到的操作来调用操作符.将值传递给采用右值引用的函数失败,并且调用std::move
对象不会触发任何操作.
为什么这段代码完全可以编译,有没有办法让这个函数运行?
clang给出warning: conversion function converting 'C' to itself will never be used
了或不带有关于类型的引用.
小智 12
struct C
{
operator C()
{
}
};
Run Code Online (Sandbox Code Playgroud)
也被允许并给出相同的警告.它在§12.3.2/ 1中提到:
转换函数从不用于将(可能是cv限定的)对象转换为(可能是cv限定的)相同的对象类型(或对它的引用),转换为该类型的(可能是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
}
Run Code Online (Sandbox Code Playgroud)