2017-10-09 100 views
2

我读了下面的帖子:C++ 98和C++ 11之间的哪些变化显示行为差异?

,也是isocpp页:

于是我开始好奇,根据标准:在C++ 11中引入的变化可能会破坏一个用C++ 98编写的程序?

+0

一些有趣的情况在这里:https://stackoverflow.com/questions/6399615/what-breaking-changes-are-introduced-in-c11我以为我有一个很好的例子,但它基于* implicit int *,它从未正式转入C++。 – Bathsheba

回答

2

突出的一个 - 从析构函数中抛出异常。

在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

0

下面是有关析构函数另一种情况在C++ 11 noexcept(真):

// 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; 
} 

原始参考: