【发布时间】: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,就无法很好地支持类似引用的行为。