如何解决即使无法编译对象构造表达式,它的格式也正确吗?
假设我们有一个不可复制类型X
:
struct X
{
X(X&&) = default;
X(const X&) = delete;
}
那么,自然地,我们不能复制以X
作为值类型的容器:
std::set<X> v;
std::set<X> v2{v} // error
我的问题是,包含此类副本的表达式是否格式正确?例如,以下表达式将编译:
sizeof( std::set<X>{v} )
自从遇到以下问题以来,我一直在问:
std::cout << std::is_copy_constructible_v< X >;
std::cout << std::is_copy_constructible_v< std::set<X> >;
哪个打印出01
。 std::set<X>
被“报告”为可复制构造,而实际上却不是(因此无法调用其复制构造函数),这有点违反直觉。
解决方法
这是由您的问题引起的,当时您的容器应支持不完整的类型。你不能两者都做
- 支持不完整的类型
- SFINAE根据值类型的可复制性淘汰特殊成员函数
如果支持不完整的类型,则无法签入复制构造函数的声明是否该类型是可复制的(因为此时它可能是不完整的)。因此,您始终可以实例化副本构造函数。但是,如果这样做,在评估的上下文中这将失败。
有一篇很好的文章:https://quuxplusone.github.io/blog/2020/02/05/vector-is-copyable-except-when-its-not/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。