gpt4 book ai didi

c++ - 为什么模板参数上的 is_copy_constructible 静态断言失败?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:43 26 4
gpt4 key购买 nike

我试图对模板参数进行静态断言,以检查/强制 Type 可复制构造。但是静态断言失败。我不明白为什么,也找不到任何文档为什么它会在静态评估中失败。

实例化的类是可复制构造的,但是它使用了我认为被称为奇怪的重复模板参数模式的东西。

完整的测试代码如下:

#include <iostream>
#include <type_traits>

using namespace std;


template<typename Type>
class FunContainer {
// static_assert(is_copy_constructible<Type>::value, "Type must be copy constructible!"); // <- This fails.
// bool copyable = is_copy_constructible<Type>::value // <- will make the second assert fail
protected:
int container_stuff = 0;
public:
int get_container_stuff() {return container_stuff;};
void set_container_stuff(int stuff) {container_stuff = stuff;};
bool is_copyable() {return is_copy_constructible<Type>::value;};
};

class Fun : public FunContainer<Fun> {
public:
std::string str = "Tastic";
Fun() = default;
Fun(const Fun& other_fun) : FunContainer<Fun>(other_fun) {
copy_internals(other_fun);
};
Fun& operator=(const Fun& other_fun){
FunContainer<Fun>::operator=(other_fun);
copy_internals(other_fun);
return *this;
};
private:
void copy_internals(const Fun& other_fun) {str = other_fun.str;};
};

static_assert(is_copy_constructible<Fun>::value, "Type must be copy constructible!"); // <- the 2nd assert

int main() {
Fun fun;
fun.set_container_stuff(10);
fun.str = "test";
Fun tastic(fun);
cout << tastic.get_container_stuff() << '\n';
cout << tastic.str << '\n';
cout << tastic.is_copyable() << '\n';
return 0;
}

结果符合预期:

10
test
1

这意味着第二个断言通过了。因此,Fun 似乎不是 FunContainer 中的 CopyConstructible。但是,is_copyable 说是。

我还尝试更改 is_copyable() 方法以使用类内初始化的 bool 它使第二个断言失败。当阻碍断言被移除时,copyable 的值被设置为 0;

似乎只有评估失败是基类中的静态复制时间。

Q1 为什么编译时检查false 而“运行时”检查true?是否因为类 (Fun) 在检查时未完全实例化/定义而失败?

Q2 这是预期的吗? (is_copy_constructible 的静态评估给出的结果不同于不同的“运行时”评估)。

问题 3 是否有一种方法可以进行编译时断言,以检查此类设计是否为 CopyConstructible?

在 clang 3.2-11、gcc 4.8.2 和 ideone 默认的 c++11 编译器上测试。

最佳答案

Q1 Why is compile-time check false and "run-time" true? Does it fail because the class (Fun) is not fully instantiated/defined at the check time?

是的。 FunContainer<Fun>Fun 之前实例化已定义,当您将其用作 Fun 时的基类。

Q2 Is this expected?

是的。

Q3 Is there a way to make a compile-time assertion that would check if class is CopyConstructible with similar design?

将您的静态断言移至稍后实例化的某个位置。里面FunContainer的构造函数对我来说似乎是个不错的选择。

关于c++ - 为什么模板参数上的 is_copy_constructible 静态断言失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21855521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com