C++ literal type

要区分 literal 和 literal-type这两个不同的概念。

literal:文字量,10,3.14, true ,u8"123",  L"好"这些东西。

literal-type: 参考http://en.cppreference.com/w/cpp/concept/LiteralType  简单的说,就可以在用于编译期运算的对象。

对于标量,例如int,显然可以参与编译期运算,例如:constexpr int fac( int N);  //计算阶乘。所以标量都是属于literal-type。

从这里可以看出,literal-type仅仅是类型系统中,一个catalog。所有的类型,要么归类到literal-type,要么归类到none-literal-type。

现在class,也能归类于literal-type,只要满足一些条件:

 1 struct point 
 2 {
 3     point(): x(0), y(0){  std::cout << "point() called" << std::endl; }
 4     constexpr point(int x_, int y_): x(x_),y(y_){}
 5     constexpr int hypot() { return x*x + y*y; }
 6     
 7 private:
 8     int x,y;
 9 };
10  
11 int main()
12 {   
13     static_assert( point(3,4).hypot() == 25 );
14     std::cout << "std::is_literal_type<point>::value=" << std::is_literal_type<point>::value;
15 }

point符合literal定义。可以参与到编译期运算static_assert。下面举个反例:

1 struct point 
2 {
3     point(): x(0), y(0){  std::cout << "point() called" << std::endl; }
4     constexpr point(int x_, int y_): x(x_),y(y_){}
5     constexpr int hypot() { return x*x + y*y; }
6     ~point(){} 
7     int x,y;
8 };

第6行,加了析构函数,point就不再是literal-type了。

1 struct point 
2 {
3     point(): x(0), y(0){  std::cout << "point() called" << std::endl; }
4     point(int x_, int y_): x(x_),y(y_){}
5     constexpr int hypot() { return x*x + y*y; }
6 private:
7     int x,y;
8 };

第6行,加了private,point就不再是aggregate-type; 并且构造函数去了constexpr。point就不是literal-type.

改造一下:

struct point 
{
    point(): x(0), y(0){  std::cout << "point() called" << std::endl; }
    constexpr point(int x_, int y_): x(x_),y(y_){}
    constexpr int hypot() { return x*x + y*y; }
private:
    int x,y;
};

现在这个none-aggregate-type就是literal-type

 

posted @ 2018-03-25 19:09  thomas76  阅读(4364)  评论(0编辑  收藏  举报