相关疑难解决方法(0)

std :: vector,默认构造,C++ 11和重大变化

我今天跑了一个非常微妙的问题我希望得到你的意见.

考虑以下花园式共享体成语类:

struct S
{
    S() : p_impl(new impl) {}
private:
    struct impl;
    boost::shared_ptr<impl> p_impl;
};
Run Code Online (Sandbox Code Playgroud)

当您尝试以下列方式将它们放入向量时,会出现这种乐趣:

std::vector<S> v(42);
Run Code Online (Sandbox Code Playgroud)

现在,至少使用MSVC 8,所有元素v共享同一个impl成员.实际上,导致这种情况的原因是vector构造函数:

template <typename T, typename A = ...>
class vector
{
    vector(size_t n, const T& x = T(), const A& a = A());
    ...
};
Run Code Online (Sandbox Code Playgroud)

在这些场景中,只有一个S对象被默认构造,从中复制了它们的n元素vector.

现在,使用C++ 11,有rvalue引用.所以它不能像这样工作.如果a vector被构造为

std::vector<S> v(42);
Run Code Online (Sandbox Code Playgroud)

然后很可能,实现将选择默认构造n向量内的对象,因为复制构造可能不可用.在这种情况下,这将是一个突破性的变化.

我的问题是:

  1. C++ 03标准是否std::vector必须具有如上定义的构造函数,即.使用默认参数?特别是保证向量对象的条目被复制而不是默认构造?
  2. C++ 11标准对同一点有什么看法?
  3. 我认为这可能会导致C++ 03和C + 11之间发生重大变化.这个问题是否已被调查过?解决了 ?

PS:请不要评论 …

c++ stl vector backwards-compatibility c++11

53
推荐指数
1
解决办法
3005
查看次数

GCC在-std = gnu ++ 0x和-std = c ++ 0x之间有什么区别?应该使用哪一个?

<stdint.h>在使用-std=c++0xGCC 4.4.3(适用于Android)时遇到麻烦:

// using -std=c++0x
#include <stdint.h>
uint64_t value;  // error: 'uint64_t' does not name a type
Run Code Online (Sandbox Code Playgroud)

但使用-std=gnu++0x作品:

// using -std=gnu++0x
#include <stdint.h>
uint64_t value;  // OK
Run Code Online (Sandbox Code Playgroud)

<stdint.h>使用C++ 0x中不兼容?

c++ android gcc compiler-options c++11

27
推荐指数
1
解决办法
1万
查看次数

Boost.Tuple是否与C++ 0x可变参数模板兼容?

我正在使用可变参数模板(gcc 4.5)并遇到这个问题:

template <typename... Args>
boost::tuple<Args...>
my_make_tuple(Args... args)
{
   return boost::tuple<Args...>(args...);
}

int main (void)
{
    boost::tuple<int, char> t = my_make_tuple(8, 'c');
}
Run Code Online (Sandbox Code Playgroud)

GCC错误消息:

sorry, unimplemented: cannot expand 'Arg ...' into a fixed-length argument list
In function 'int my_make_tuple(Arg ...)'
Run Code Online (Sandbox Code Playgroud)

如果我更换的每次出现boost::tuplestd::tuple,它编译罚款.
boost元组实现有问题吗?或者这是一个gcc bug?

我现在必须坚持使用Boost.Tuple.你知道任何解决方法吗?
谢谢.

c++ gcc variadic boost-tuples c++11

5
推荐指数
1
解决办法
1518
查看次数