C++ 编译器赢得';是否不使用复制分配代替移动?

C++ 编译器赢得';是否不使用复制分配代替移动?,c++,c++11,copy-assignment,move-assignment-operator,C++,C++11,Copy Assignment,Move Assignment Operator,我有一个类,其中移动赋值被显式删除,因为对象不应该是可移动的。但是如果我使用RVO分配给这个类的实例,编译器会给出错误: main.cpp:12:16: note: candidate function has been explicitly deleted 此外,编译器提到了现有的复制赋值运算符,但没有使用它 以下是我的代码(或(未)运行的示例): 我发现了一个非常相似的帖子 我知道我可以通过使用临时工具来避免这种情况。我想知道为什么每个编译器(我用gcc、clang和vs2013测试过)都

我有一个类,其中移动赋值被显式删除,因为对象不应该是可移动的。但是如果我使用RVO分配给这个类的实例,编译器会给出错误:

main.cpp:12:16: note: candidate function has been explicitly deleted
此外,编译器提到了现有的复制赋值运算符,但没有使用它

以下是我的代码(或(未)运行的示例):

我发现了一个非常相似的帖子


我知道我可以通过使用临时工具来避免这种情况。我想知道为什么每个编译器(我用gcc、clang和vs2013测试过)都不能直接调用现有的拷贝分配?是否缺少某些内容?

不会调用复制分配,因为(已删除的)移动分配更适合重载解决方案

根本不声明移动分配。然后将选择复制分配。不会生成隐式移动分配运算符,因为该类具有用户声明的复制构造函数、移动构造函数和复制分配运算符。这些操作都会阻止隐式移动赋值运算符的生成


但是如果我使用RVO分配给这个类的一个实例

这里没有涉及RVO。您可以创建一个临时的
foo
,并将其复制分配给现有变量。复制作业不能省略


此外,从赋值运算符按值返回非常不寻常且效率低下。

您可以使用placement new来执行此操作:

#include <iostream>
#include <string>
#include <new>

class foo {
public:

    foo() {}
    foo(foo const& r) {}
    foo(foo&&) = delete;

    foo const& operator=(foo const& r) { return *this; }
    foo const& operator=(foo&& r) = delete;
};

int main(int argc,char **argv)
{
    foo bar;

    //bar = foo();
    bar.~foo();
    new(&bar) foo();

    return 0;
}
#包括
#包括
#包括
福班{
公众:
foo(){}
foo(foo const&r){}
foo(foo&&)=删除;
foo const&operator=(foo const&r){return*this;}
foo const&operator=(foo&r)=删除;
};
int main(int argc,字符**argv)
{
富吧;
//bar=foo();
巴。~foo();
新建(&bar)foo();
返回0;
}
就像
std::move()
应用
静态\u cast()
强制使用移动分配/构造函数一样,可以执行类似于强制使用复制分配/构造函数的操作:

#include <iostream>

class foo
{
public:

    foo() {}
    foo(foo const& r) {}
    foo(foo&&) = delete;

    foo const& operator=(foo const& r) { std::cout << ":)\n"; return *this; }
    foo const& operator=(foo&& r) = delete;
};

int main(int argc, char **argv)
{
    foo bar;
    bar = static_cast<const foo&>(foo());
    return 0;
}
#包括
福班
{
公众:
foo(){}
foo(foo const&r){}
foo(foo&&)=删除;

foo常量和运算符=(foo常量和运算符){std::cout move assignment操作符更匹配。在考虑将其删除之前,会发生这种情况。删除的函数参与重载解析。出于好奇,为什么要使类不可移动?@NathanOliver Company喜欢较慢的代码。:@erip也许该公司通过计算程序运行的周期来衡量工作umes。
另外,从赋值运算符按值返回是非常不寻常且效率低下的。
这是真的,而且erip(
公司喜欢较慢的代码。
)的评论也是如此。我正在处理一个不是我设计的类,只是想知道为什么会发生这种情况。。。
#include <iostream>

class foo
{
public:

    foo() {}
    foo(foo const& r) {}
    foo(foo&&) = delete;

    foo const& operator=(foo const& r) { std::cout << ":)\n"; return *this; }
    foo const& operator=(foo&& r) = delete;
};

int main(int argc, char **argv)
{
    foo bar;
    bar = static_cast<const foo&>(foo());
    return 0;
}