gpt4 book ai didi

c++ - 即使该构造无法编译,对象构造表达式是否格式良好?

转载 作者:行者123 更新时间:2023-12-03 06:50:22 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





std::unordered_map<T,std::unique_ptr<U>> copyable? GCC bug?

(1 个回答)


11 个月前关闭。




假设我们有一个不可复制的类型 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/

    关于c++ - 即使该构造无法编译,对象构造表达式是否格式良好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64681828/

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