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 需要为此进行评估。这是先有鸡还是先有蛋的问题。