我有一个类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");
答案 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)
在您的示例中,您隐式将构造函数声明为私有(类类型中的默认可访问性)。
如果您的真实代码也是如此,那可能就是问题所在。