【问题标题】:Examples of code successfully compiled in C++11 and pre-C++11 that behave differently [duplicate]在 C++11 和 pre-C++11 中成功编译但行为不同的代码示例 [重复]
【发布时间】:2014-02-16 03:22:21
【问题描述】:

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

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

工作示例将不胜感激。

【问题讨论】:

  • 这是编写单元测试和执行回归测试的原因吗?
  • @chris 不,不是破坏性更改。仍然可以编译但行为不同的标准之间的变化
  • @EdHeal 同意,但我有兴趣特别了解 C++ 标准中的非破坏性但行为不同的变化。
  • @TrevorHickey,那里有很多可以编译但行为不同的示例。

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


【解决方案1】:

正如克里斯指出的那样,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()

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

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

不会编译。而且我认为这个案例足以激发破坏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多