即使复制/移动构造函数是默认的,std :: is_copy / move_constructible也会失败

时间:2015-06-25 15:56:58

标签: c++ copy-constructor c++14 move-constructor

我有一个类Input,它有默认的移动/复制构造函数。

setDefaultUri("https://myServer/soapws/ws/");
Source requestSource = new ResourceSource(new ClassPathResource("MyRequest.xml"));
StringResult result = new StringResult();
WebServiceTemplate template = getWebServiceTemplate();

HttpsUrlConnectionMessageSender sender = new HttpsUrlConnectionMessageSender();
sender.setTrustManagers(new TrustManager[] { new UnTrustworthyTrustManager() });
template.setMessageSender(sender);

template.sendSourceAndReceiveToResult(requestSource, result);
System.out.println(result);

然而,以下断言失败了。

Input(const Input &) = default;
Input(Input &&) = default;

为什么?

以下是一个完整的例子:

static_assert(std::is_copy_constructible<Input>(), "Input is not copy-constructible");
static_assert(std::is_move_constructible<Input>(), "Input is not move-constructible");

4 个答案:

答案 0 :(得分:8)

您的问题是static_assert在类声明中。编译器无法确定何时到达static_assert该类是复制还是可移动构造,因为该类尚未完全定义。

答案 1 :(得分:5)

问题是你在课堂上进行了测试。为了评估static_assert,编译器需要完成该类。这是不可能的,因为需要对static_assert进行评估。这是一个鸡与蛋的问题。

答案 2 :(得分:1)

此代码段(live on Ideone)似乎运行正常:

#include <type_traits>

class Input {
public:
  Input(const Input &) = default;
  Input(Input &&) = default;
};

int main() {
  static_assert(std::is_copy_constructible<Input>(), "");
  static_assert(std::is_move_constructible<Input>(), "");
}

答案 3 :(得分:0)

在您的示例中,您隐式将构造函数声明为私有(类类型中的默认可访问性)。

如果您的真实代码也是如此,那可能就是问题所在。