Dan*_*ica 6 c++ well-formed language-lawyer
假设我们有一个不可复制的类型X:
struct X
{
X(X&&) = default;
X(const X&) = delete;
}
Run Code Online (Sandbox Code Playgroud)
然后,自然地,我们不能复制具有X作为值类型的容器:
std::set<X> v;
std::set<X> v2{v} // error
Run Code Online (Sandbox Code Playgroud)
我的问题是,涉及这种副本的表达式是否格式正确?例如,编译以下表达式:
sizeof( std::set<X>{v} )
Run Code Online (Sandbox Code Playgroud)
我问是因为我遇到了以下问题:
std::cout << std::is_copy_constructible_v< X >;
std::cout << std::is_copy_constructible_v< std::set<X> >;
Run Code Online (Sandbox Code Playgroud)
打印出来01。有点违反直觉,std::set<X>即“报告”为可复制构造,而实际上并非如此(因此无法调用其复制构造函数)。
这是由于您遇到的一个问题,当您的容器应支持不完整的类型时。你不能两者兼而有之
如果您支持不完整类型,则无法检查复制构造函数的声明是否可复制(因为此时它可能不完整)。因此,您始终可以实例化复制构造函数。但如果你这样做,那么在评估的上下文中就会失败。
有一篇关于此的好文章:https://quuxplusone.github.io/blog/2020/02/05/vector-is-copyable- except-when-its-not/
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |