【发布时间】:2011-08-11 04:21:31
【问题描述】:
我今天遇到了一个非常微妙的问题,我想听听你的意见。
考虑以下花园式的 shared-body-idiom 类:
struct S
{
S() : p_impl(new impl) {}
private:
struct impl;
boost::shared_ptr<impl> p_impl;
};
当您尝试通过以下方式将它们放入向量时,就会出现乐趣:
std::vector<S> v(42);
现在,至少在 MSVC 8 中,v 中的所有元素共享同一个 impl 成员。实际上,造成这种情况的原因是 vector 构造函数:
template <typename T, typename A = ...>
class vector
{
vector(size_t n, const T& x = T(), const A& a = A());
...
};
在场景下,只有一个S 对象被默认构造,vector 的n 元素是从中复制而来的。
现在,在 C++11 中,有右值引用。所以它不能像这样工作。如果vector 构造为
std::vector<S> v(42);
那么很可能,实现将选择默认构造向量内的n 对象,因为复制构造可能不可用。在这种情况下,这将是一个重大变化。
我的问题是:
- C++03 标准是否要求
std::vector必须具有如上定义的构造函数,即。使用默认参数?特别是是否可以保证向量对象的条目被复制而不是默认构造? - C++11 标准对这一点有什么看法?
- 我认为这是 C++03 和 C+11 之间发生重大变化的可能性。有没有调查过这个问题?解决了吗?
PS:请不要对上面的类S 的默认构造函数进行cmets。就是这样或实现某种形式的惰性构造。
【问题讨论】:
-
这简直令人震惊。编译 C++ 代码但在 C++0X 中赋予它新的含义是我能想到的最糟糕的情况。我很想像使用 DOS 4 或 Windows ME 一样传递这只手。
-
这应该是威胁吗?您是否将 C++0x 与 Windows ME 进行比较?
-
恕我直言,从一个名叫“6502”的人那里听到这句话有点好笑……
标签: c++ stl vector c++11 backwards-compatibility