【问题标题】:Macro that checks std::vector requirements检查 std::vector 要求的宏
【发布时间】:2015-07-14 23:09:18
【问题描述】:

我有一个不可变的类——所有成员都是const。由于它是不可变的,因此没有默认构造函数,也没有复制赋值。在 C++11 中,我在 std::vector 中使用这个类没有问题。

现在我需要在只支持C++03的环境下编译代码。显然我的类不是CopyAssignable,而C++03std::vector需要这个,我不能把类的实例放在一个向量中。

由于代码将在 C++11 友好的编译器上维护,并且只能在 C++03 环境中编译和运行,我认为完成这项工作的最简单方法是 删除const C++03 中的修饰符。这将使类 CopyAssignable 并在 C++03 中工作。当然,在 C++11 中,我仍然希望类是不可变的。

我翻阅了一长串 Boost C++11 Macros,但找不到能告诉我 std::vector 是否需要 CopyAssignable 类型的列表。

有没有办法做到这一点,或者我应该只引入我自己的宏,将在编译期间设置?

【问题讨论】:

  • “因为它是不可变的,所以没有默认构造函数。” 嗯,什么?
  • 好吧,使用默认构造函数创建的所有实例都是相同的,因为没有办法将它们的值设置为默认值。所以没有默认构造函数。
  • 虽然它可以是一个合理的设计选择,但这并不是从前提得出的合乎逻辑的结论。我理解 orlp 的困惑。 “它是不可变的,所以我没有添加默认 ctor”将是更准确的描述。更难以理解的是缺少复制 ctor。 4 可能是不可变的,但我当然可以复制它。
  • @MSalters (大概)有一个复制构造函数。缺少的是赋值运算符。但是,是的,在像 C++ 这样具有值类型而不是引用类型 UDT 变量的语言中,使不可变结构不可赋值并不一定合适。
  • 嗯,C++ 不会对类似引用的 UDT 产生偏见。毕竟他们是UD。但是 C++03 容器类确实期望值,是的。没有emplace_back,就无法很好地支持类似引用的行为。

标签: c++ c++11 vector c++03


【解决方案1】:

检查 C++ 版本可能最简单; #if __cplusplus < 201103L 应该足够了。大概没有 Boost 宏对此进行检查,因为所有 C++11 编译器在这方面都是兼容的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多