gpt4 book ai didi

c++ - 转换为 Type&& 运算符的类型

转载 作者:可可西里 更新时间:2023-11-01 15:51:12 25 4
gpt4 key购买 nike

我很惊讶地看到以下编译:

struct C {
operator C&&() {
std::cerr << "ref'd\n";
throw std::runtime_error("what is happening?");
}
};

一种带有运算符的类型,用于其自身的右值引用转换。但是,我无法使用我认为可能会做的事情来调用运算符(operator)。将值传递给采用右值引用的函数失败,并且在对象上调用 std::move 不会触发任何内容。

为什么这段代码能够编译,有什么方法可以让这个函数运行?

clang 给出 警告:无论是否引用类型,都永远不会使用将“C”转换为自身的转换函数

最佳答案

struct C
{
operator C()
{
}
};

也是允许的,并给出相同的警告。在 §12.3.2/1 中提到:

A conversion function is never used to convert a (possibly cv-qualified) object to the (possibly cv-qualified) same object type (or a reference to it), to a (possibly cv-qualified) base class of that type (or a reference to it), or to (possibly 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
}

关于c++ - 转换为 Type&& 运算符的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28131172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com