decltype3.c

来自「用于进行gcc测试」· C语言 代码 · 共 73 行

C
73
字号
// { dg-do "compile" }// { dg-options "-std=gnu++0x" }template<typename T, typename U> struct is_same {  static const bool value = false;};template<typename T>struct is_same<T, T>{  static const bool value = true;};#define CHECK_DECLTYPE(DECLTYPE,RESULT) \  static_assert(is_same< DECLTYPE , RESULT >::value, #DECLTYPE " should be " #RESULT)class A { public:  int a;   int& b;   static int c;   A(int& b) : b(b) { }  void foo() {     CHECK_DECLTYPE(decltype(a), int);    CHECK_DECLTYPE(decltype(this->a), int);    CHECK_DECLTYPE(decltype((*this).a), int);    CHECK_DECLTYPE(decltype(b), int&);    CHECK_DECLTYPE(decltype(c), int);  }   void bar() const {    CHECK_DECLTYPE(decltype(a), int);    CHECK_DECLTYPE(decltype(b), int&);    CHECK_DECLTYPE(decltype(c), int);  } }; int b;A aa(b); const A& caa = aa; CHECK_DECLTYPE(decltype(aa.a), int);CHECK_DECLTYPE(decltype(aa.b), int&);CHECK_DECLTYPE(decltype(caa.a), int);class B { public:  int a;  // { dg-error "invalid use" }  enum B_enum { b };   decltype(a) c; // { dg-error "from this location" }  decltype(a) foo() { } // { dg-error "from this location" }  decltype(b) enums_are_in_scope() { return b; } // ok }; CHECK_DECLTYPE(decltype(aa.*&A::a), int&);decltype(aa.*&A::b) zz; // { dg-error "cannot create pointer to reference member" }// { dg-error "invalid type" "" { target *-*-* } 58 }CHECK_DECLTYPE(decltype(caa.*&A::a), const int&);class X {   void foo() {     CHECK_DECLTYPE(decltype(this), X*);    CHECK_DECLTYPE(decltype(*this), X&);  }   void bar() const {     CHECK_DECLTYPE(decltype(this), const X*);    CHECK_DECLTYPE(decltype(*this), const X&);  } };

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?