管道器说明符 (C++11)

注: IBM 支持 C++11的所选功能,在批准之前称为 C++0x 。 IBM 将继续开发和实施此标准的功能部件。 语言级别的实现基于 IBM对标准的解释。 在完成 IBM对所有 C++11 功能部件的实现 (包括对新的 C++11 标准库的支持) 之前,实现可能会随着发行版而更改。 IBM 不会尝试在源代码,二进制或列表以及其他编译器接口中维护与 IBM的先前发行版实现新的 C++11 功能部件的兼容性。

C++11 标准引入了新的关键字constexpr作为声明说明符。 您可以应用constexpr说明符仅适用于以下上下文:

  • 变量的定义
  • 函数或函数模板的声明
  • 静态数据成员的声明

例如:

constexpr int i = 1;       // OK, definition
constexpr extern int j;    // Error, not a definition
constexpr int f1();        // OK, function declaration, but must be defined before use

如果您声明的函数不是具有constexpr说明符,该函数是constexpr功能。 类似地,如果您使用constexpr说明符,该构造函数是constexpr构造函数。 两者constexpr功能和constexpr构造函数隐式内联。 例如:

struct S {
  constexpr S(int i) : mem(i) { }   // OK, declaration of a constexpr constructor
  private:
    int mem;
};
constexpr S s(55);      // OK, invocation of a constexpr constructor

如果指定了函数或函数模板的任何声明constexpr,其所有声明都必须包含constexpr说明符。 例如:

constexpr int f1();         // OK, function declaration
int f1() {                  // Error, the constexpr specifier is missing
  return 55;
}     

不能使用以下命令声明函数参数:constexpr说明符。 以下示例对此进行了演示:

constexpt int f4(constexpr int);      //Error

Aconstexpr在对象声明中使用的说明符将对象声明为const. 此类对象必须是字面值类型且已初始化。 如果它由构造函数调用初始化,那么该调用必须是常量表达式。 否则,如果constexpr在引用声明中使用说明符,在其初始化程序中出现的每个完整表达式都必须是常量表达式。 在转换初始化方法表达式时使用的每个隐式转换以及用于初始化的每个构造函数调用都必须在常量表达式中有效。 例如:

constexpr int var;         // Error, var is not initialized
constexpr int var1 = 1;  // OK

void func() {
  var1 = 5;   //Error, var1 is const
}

struct L {
  constexpr L() : mem(55) { }
  constexpr L(double d) : mem((int)d) { }
  L(int i) : mem(i) { }
  operator int() { return mem; }
private:
  int mem;
};

// Error, initializer involves a non-constexpr constructor.
constexpr L var2(55);   

double var3 = 55;

// Error, initializer involves a constexpr constructor with non-constant argument
constexpr L var4(var3);   

// Error, involves conversion that uses a non-constexpr conversion function
constexpr int var5 = L();  

Aconstexpr非构造函数的非静态成员函数的说明符声明要使用的成员函数const. 那一类constexpr成员函数必须是文字类型。 在以下示例中,类NL是非文字类型,因为它具有用户提供的析构函数。

struct NL {
  constexpr int f(){       //error, enclosing class is not a literal type
     return 55;
  }       
  ~NL() { }
};

调用constexpr函数产生的结果与调用等效非-constexpr函数,除了调用constexpr函数可以出现在常量表达式中。

main不能使用constexpr说明符。