2016-08-05 28 views
2

我尝试从临时对构建一对。据我所知,std :: pair提供了必要的构造函数,但是我无法使它工作。这是我最小的例子:从临时对创建一对

#include <utility> 

struct Test { 
    Test() : a(1.0) {} 

private: 
    double a; 
    Test(Test&&) = default; 
    Test(const Test&) = delete; 
    Test& operator=(Test&&) = delete; 
}; 

int main (int argc, char** argv) { 
    std::pair<Test, double> result(Test(), 0.0); 
} 

我试图编译这与clang++-3.8 --std=c++14。 Test的拷贝构造函数由pair调用。因为它已被删除,所以我收到错误call to deleted constructor of 'Test'。但编译器似乎并没有问题,因为我得到了与gcc类似的错误,请参阅https://ideone.com/n5GOeR

有人可以向我解释为什么上面的代码无法编译?

+2

由于您没有办法复制或移动'Test',您如何期望'std :: pair'的构造函数执行此操作? – Quentin

+0

我试图显式启用'Test'的移动构造函数。 – user3910279

+1

将移动构造函数放入'public'部分后,[它工作得很好](http://coliru.stacked-crooked.com/a/77a1983a12219dfc)。 – Quentin

回答

5

我的海湾合作委员会(6.1.1)给出了略有不同的错误信息,这是比较有帮助的:

t.C:8:3: note: declared private here 
    Test(Test&&) = default; 
    ^~~~ 

你我的行动构造函数是私有的。显然必须公开。

+0

奇怪的是,这是(删除的)复制构造函数,不应该通过重载解析来选择。我不知道GCC Ideone使用哪个版本,但看起来它有一个错误。 – Quentin

+0

是的,我的gcc提供了更好的诊断。更新。 –

+0

@Quentin这很奇怪,我只是尝试了gcc.godbolt.org和GCC的每个版本,以4.4.7开头(他们有最早的版本)正确地将移动构造函数的错误设置为私有。 –