【问题标题】:What changes between C++98 and C++11 show difference in behavior?C++98 和 C++11 之间的哪些变化显示了行为差异?
【发布时间】:2018-03-20 21:26:38
【问题描述】:

我正在阅读以下帖子:

还有isocpp页面:

所以我开始好奇,根据标准:C++11 中引入的哪些更改可能会破坏用 C++98 编写的程序?

【问题讨论】:

标签: c++11 language-lawyer c++98


【解决方案1】:

一个突出的大问题——从析构函数中抛出异常。

在 C++98 中,如果您小心的话,您可以拥有执行此操作的程序并且可以正常工作。

在 C++11 中,您通常必须显式声明 dtor noexcept(false)

很好的blog post here,在 Andrzej 的 C++ 博客上。

简而言之,以下程序曾经在 C++03 中成功运行(在某种“成功”的定义下):

struct S
{
  ~S() { throw runtime_error(""); } // bad, but acceptable
}; 

int main()
{
  try { S s; }
  catch (...) {
    cerr << "exception occurred";
  } 
  cout << "success";
}

在 C++11 中,同一程序将触发对 std::terminate 的调用。

【讨论】:

    【解决方案2】:

    这是与 C++11 中的析构函数相关的另一个案例 noexcept(true):

    // A simple program that demonstrates how C++11 and pthread_cancel don't play
    // nicely together.
    //
    // If you build without C++11 support (g++ threadkill.cpp -lpthread), the
    // application will work as expected. After 5 seconds, main() will cancel the
    // thread it created and the program will successfully exit.
    //
    // If you build with C++11 support(g++ -std=c++11 threadkill.cpp -lpthread),
    // the program will crash because the abi::__forced_unwind exception will
    // escape the destructor, which is implicitly marked as noexcept(true) in
    // C++11. If you mark the destructor as noexcept(false), the program does 
    // not crash.
    #include <iostream>
    #include <unistd.h>
    #include <string.h>
    
    class sleepyDestructorObject
    {
    public:
        ~sleepyDestructorObject() //noexcept(false)
        {
            std::cout << "sleepy destructor invoked" << std::endl;
            while(true)
            {
                std::cout << "." << std::flush;
                sleep(1);
            }
        }
    };
    
    void* threadFunc( void* lpParam )
    {
        sleepyDestructorObject sleepy;
        return NULL;
    }
    
    int main(int argc, char** argv)
    {
        pthread_t tThreadID;
        pthread_create(&tThreadID, NULL, threadFunc, NULL);
        sleep(5);
        pthread_cancel(tThreadID);
        pthread_join(tThreadID, NULL);
        return 0;
    }
    

    原文参考:

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      相关资源
      最近更新 更多