C++ 在C++;11和C&x2B之前+;11行为不同的

C++ 在C++;11和C&x2B之前+;11行为不同的,c++,c++11,language-lawyer,undefined-behavior,C++,C++11,Language Lawyer,Undefined Behavior,C++11为该语言的核心方面带来了新的关键字和新的变化。 那么,在C++11和pre-C++11中成功编译同一段代码是否可能,但从每个二进制文件中得到不同的结果?在C++11之前,我指的是C++98、C++03或C++TR1 我之所以问这个问题,是因为我有一个小程序,都是用C++编写的。我不知道编写的每个程序的标准是什么。如果这些程序都在C++11以及早期标准中编译,它们的行为保证是相同的吗?我想在C++11中编译它们(如果可以的话),但是如果考虑到早期的标准,请避免任何可能导致程序行为不同的细

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

我之所以问这个问题,是因为我有一个小程序,都是用C++编写的。我不知道编写的每个程序的标准是什么。如果这些程序都在C++11以及早期标准中编译,它们的行为保证是相同的吗?我想在C++11中编译它们(如果可以的话),但是如果考虑到早期的标准,请避免任何可能导致程序行为不同的细微更改

工作实例将不胜感激

正如克里斯指出的,这是这个问题的重复。但是,我在对该问题的回答中没有看到以下内容:

#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++11中,此输出:

X()
X(const X&)
X(const X&)
X(const X&)
X()
X()
X()
对于几乎所有的代码,这没有什么区别。然而,“几乎”并不是“总是”,所以这是一个突破性的(行为差异)变化。你可以为这一变化责怪我个人。没有它:

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

不会编译的。我认为这个案例充分激发了破坏性。

这就是编写单元测试和执行回归测试的原因吗?@chris no,不是破坏性更改。仍在编译但行为正常的标准之间的更改differently@EdHeal同意,但我感兴趣的是明确了解C++标准中的非破坏性但不同行为的变化。@ TrevorHickey,有很多例子可以编译,但行为不同。