std::is_copy/move_constructible 即使默认 copy/move 构造函数也会失败
std::is_copy/move_constructible fails even though copy/move constructors are defaulted
我有一个 class 输入,它有默认的 move/copy 构造函数。
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");
这是为什么?
这是一个完整的例子:
#include <type_traits>
class A {
public:
A(const A &) = default;
static_assert(std::is_copy_constructible<A>(), "");
};
int main() {
// your code goes here
return 0;
}
此代码片段 (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>(), "");
}
在您的示例中,您将构造函数隐式声明为私有(class 类型中的默认可访问性)。
如果您的真实代码也是如此,那可能就是问题所在。
您的问题是 static_assert
在 class 声明中。编译器在到达 static_assert
时无法确定 class 是可复制还是可移动构造,因为 class 尚未完全定义。
问题是您在 class 本身中进行了测试。为了计算 static_assert
,编译器需要完成 class。这是不可能的,因为 static_assert
需要为此进行评估。这是先有鸡还是先有蛋的问题。
我有一个 class 输入,它有默认的 move/copy 构造函数。
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");
这是为什么?
这是一个完整的例子:
#include <type_traits>
class A {
public:
A(const A &) = default;
static_assert(std::is_copy_constructible<A>(), "");
};
int main() {
// your code goes here
return 0;
}
此代码片段 (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>(), "");
}
在您的示例中,您将构造函数隐式声明为私有(class 类型中的默认可访问性)。
如果您的真实代码也是如此,那可能就是问题所在。
您的问题是 static_assert
在 class 声明中。编译器在到达 static_assert
时无法确定 class 是可复制还是可移动构造,因为 class 尚未完全定义。
问题是您在 class 本身中进行了测试。为了计算 static_assert
,编译器需要完成 class。这是不可能的,因为 static_assert
需要为此进行评估。这是先有鸡还是先有蛋的问题。