C++03이랑 C++11에서 컴파일되는 코드가 다른 결과를 낼 수 있나요?


질문이랑 똑같습니다. C++03이랑 C++11에서 컴파일되는 코드가 다른 결과를 낼 수 있나요? 한쪽에서 실행이 안 되는 경우 말구요. 둘 다 실행은 되는데 결과가 다른 경우가 있을까요?

  • 2016년 01월 15일에 작성됨

조회수 254


1 답변


좋아요
0
싫어요
채택취소하기

물론 가능합니다. 자주 있는 일은 아니지만 그런 예시를 보여드릴게요

- String literal에서

#define u8 "abc"
const char* s = u8"def";

s

  • C++03: "abcdef"
  • C++11: "def"

- 0으로 Type 변환할 때

void f(void *); // #1
void f(...); // #2
template<int N> void g() {
    f(0*N);
}

f(0*N)에서

  • C++03: #1이 호출됨
  • C++11: #2이 호출됨

- int형 나누기(/), 나머지(%)의 결과를 올림 할 때

  • C++03: 0 또는 negative inifinity로 올림 할 수 있음
  • C++11: 오직 0만 허용

int i = (-1) / 2; // C++03에서는 -1, C++11에서는 0

템플릿에서 >>, > >(중간에 공백)를 처리할 때

  • c++03에서 >>right-shift로 해석될 수 있음
template< unsigned len > unsigned int fun(unsigned int x);
typedef unsigned int (*fun_t)(unsigned int);
template< fun_t f > unsigned int fon(unsigned int x);

void total(void) {
    // fon<fun<9> >(1) >> 2 //03,11 모두 사용 가능
    unsigned int A = fon< fun< 9 > >(1) >>(2);

    // C++03에서는 fon<fun<4> >(2)
    // C++11에서는 컴파일에러
    unsigned int B = fon< fun< 9 >>(1) > >(2);
}

- new연산자가 throw하는 exeption

  • c++03: new가 실패하면 bad_alloc throw
  • c++11: new가 실패하면 exception throw
struct foo { void *operator new(size_t x){ throw std::exception(); } }
try {
    foo *f = new foo();
catch (std::bad_alloc &) {
    // c++03 code
} catch (std::exception &) {
    // c++11 code
}

- 유저가 정의한 소멸자의 exception

  • C++03: 아무 exception이나 throw 할 수 있음.
  • C++11: exception을 throw 할 수 없음. exception이 발생한 경우 std::terminate를 call (기본으로 noexcept이 설정되어 있기 때문)
struct A {
    ~A() { throw "foo"; } // C++11에서는 std::terminate을 call
};
//...
try { 
    A a; 
} catch(...) { 
    // C++03에서는 exception을 catch
} 

- container의 size() 함수의 수행 시간

  • C++03 : 최악의 경우 O(n)
  • C++11 : O(1)
std::list<double> list;
// ...
size_t s = list.size(); // C++11에서 더 빨라짐!

- C++11부턴 std::ios_base::failurestd::exception에서 분리됨


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close