相关疑难解决方法(0)

C++代码可以在C++ 03和C++ 11中有效但是做不同的事情吗?

C++代码是否可以符合C++ 03标准和C++ 11标准,但根据编译的标准,可以做不同的事情吗?

c++ language-lawyer c++11 c++03

294
推荐指数
7
解决办法
2万
查看次数

C++ 11中引入了哪些重大变化?

我知道至少有一个C++ 11中的更改​​会导致一些旧代码停止编译:explicit operator bool()在标准库中引入,替换旧的实例operator void*().当然,这将破坏的代码可能是首先不应该有效的代码,但它仍然是一个重大变化:过去不再有效的程序.

还有其他重大变化吗?

c++ c++11

226
推荐指数
9
解决办法
3万
查看次数

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
查看次数

为什么std :: bind1st可能被认为"几乎无法使用"?

在谈话期间boost::bind,有人注意到它std::bind1st存在于C++ 03中,但它"几乎无法使用".

我找不到任何可靠的支持.

boost::bind文件说:

boost :: bind是标准函数std :: bind1ststd :: bind2nd的泛化.它支持任意函数对象,函数,函数指针和成员函数指针,并且能够将任何参数绑定到特定值或将输入参数路由到任意位置.bind不对函数对象提出任何要求; 特别是,它不需要 result_type,first_argument_typesecond_argument_type标准typedef.

或许暗示这些限制确实适用于std::bind1st.

比对参数的数目明显的限制,还有什么优势boost::bind,以std::bind1st/ std::bind2ndstd::bind1st在C++ 03中"几乎无法使用" 的断言是否有任何优点?

c++ std boost-bind

4
推荐指数
1
解决办法
1440
查看次数

如何在MSVC下检测C++ 11 for noexcept功能?

我正在使用C++库.该库的最低要求是C++ 03.我在Visual Studio 2015中捕获一些关于抛出析构函数的警告:

... algparam.h(271): warning C4297: 'AlgorithmParametersBase::~AlgorithmParametersBase':
    function assumed not to throw an exception but does
... algparam.h(271): note: destructor or deallocator has
    a (possibly implicit) non-throwing exception specification
Run Code Online (Sandbox Code Playgroud)

投掷是在20世纪90年代编写代码时设计的,但它现在显示了它的年龄.我们现在有点装箱,因为我们尚未准备好迎接重大版本的颠簸.(而且它不是那么糟糕,因为它听起来初步筋膜,因为它扼守基于扔uncaught_exception).

我想通过检测C++ 11然后添加来修复该问题noexcept(false).我打算在宏中隐藏它,所以代码将在C++ 03和C++ 11下编译.

以下内容无法在Visual Studio 2015下检测C++ 11.它不会产生预期的编译器错误:

#if (__cpluplus >= 201103L)
# error Not C++11
#endif
Run Code Online (Sandbox Code Playgroud)

此外,Microsoft似乎没有提供用于检测语言功能的预定义宏.

如何在Visual Studio 2015下检测C++ 11?


相关,我可以通过检测MSVC编译器的版本_MSC_VER.我认为这将是_MSC_VER=1900VS2015.但它并没有告诉我有关语言功能的任何信息.

如果用户登记VS2015,但语言功能很重要,但使用的是低级C++标准.另外,我没有VS2013进行测试,所以我不确定1-off字符串是_MSC_VER=1700不是一个好主意.我更愿意学习它的C++ 11.


我在使用Clang和GCC编译器的OS X和Linux上遇到了类似的问题.例如,参见如何为C++ …

c++ destructor c-preprocessor c++11 visual-studio-2015

4
推荐指数
1
解决办法
932
查看次数