在C ++ 11和pre-C ++ 11中成功编译的代码示例,其行为方式不同

时间:2014-02-16 03:22:22

标签: c++ c++11 language-lawyer undefined-behavior

C ++ 11 为该语言的核心方面带来了新的关键词和新变化 那么是否有可能在 C ++ 11 pre-C ++ 11 中成功编译相同的代码,但是从每个二进制文件中得到不同的结果?通过 pre-C ++ 11 ,我指的是 C ++ 98 C ++ 03 C + + TR1 即可。

我问的原因是因为我有一堆用C ++编写的小程序。我不知道每个编写的程序都考虑了什么标准。如果它们都在 C ++ 11 以及早期标准中编译,那么这些程序的行为是否保证是相同的?我想在 C ++ 11 中编译它们(如果它们可以),但是如果考虑到早期标准,可以避免任何可能导致程序行为不同的微妙变化。

非常感谢工作示例。

1 个答案:

答案 0 :(得分:7)

正如克里斯指出的,this是这个问题的副本。但是我没有在这个问题的答案中看到以下内容:

#include <vector>
#include <iostream>

struct X
{
    X() {std::cout << "X()\n";}
    X(const X&) {std::cout << "X(const X&)\n";}
};

int
main()
{
    std::vector<X> v(3);
}

在C ++ 03中输出:

X()
X(const X&)
X(const X&)
X(const X&)

在C ++ 11中输出:

X()
X()
X()

对于几乎所有代码,这都没有区别。但是&#34;几乎&#34;不是&#34;总是&#34;,所以这是一个突破(行为差异)的变化。你可以责怪我这个改变。没有它:

std::vector<std::unique_ptr<int>> v(3);

不会编译。我认为这个案例足以激励破产。