我今天遇到了一个非常微妙的问题,希望听听您的意见。
考虑以下普通的共享主体习语类:
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);
最有可能的情况是,实现会选择默认构造 vector
内部的 n
个对象,因为复制构造函数可能不可用。在这种情况下这将是一个破坏性的变化。
我的问题是:
- C++03标准是否要求
std::vector
必须定义如上所述的构造函数,即带有默认参数?特别地,是否保证向量对象的条目被复制而不是默认构造? - C++11标准对此同一点说了什么?
- 我认为这可能会导致C++03和C+11之间的破坏性变化。这个问题已经被调查过了吗?解决了吗?
注:请不要评论上面类 S
的默认构造函数。这样做或者实现某种形式的延迟构造。