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
转载于:https://www.cnblogs.com/thomas76/p/8646036.html
C++ literal type相关推荐
- go iris框架 常见错误1: cannot use func literal type func报错记录 解决方案
错误: # command-line-arguments .\IrisDemo1.go:12:26: cannot use func literal (type func("github.c ...
- golang 错误: cannot use XXX literal (type XXX) as type XXX in assignment:XXX does not implement XXX
出错代码如下: package mainimport ("fmt" )type Speaker interface {Hello() }type User struct {Name ...
- golang json 获取所有key_Golang —— JSON 大法
「每一个程序员都无法逃脱 JSON 的命运魔爪」 JSON 简直就是一个神奇的玩意,只要是人类可以阅读的数据结构,基本都可以转成 JSON 的数据格式,其在各个平台.组件.模块中穿梭不止,使用上更是游 ...
- 【Go语言】【12】GO语言的结构体
当我第一次接触到C语言时,就对结构体投入了极大的兴趣,认为这个东西以后大有作为,后来接触Java.C++,面向对象编程中的对象进入我的视线,经过了这么多年的磨练,回过头来再看结构体依旧是那么亲切:同时 ...
- golang 接口类型 interface 简介
目录 1. Go 语言与鸭子类型的关系 2. 值接收者和指针接收者的区别 方法 值接收者和指针接收者 两者分别在何时使用 3. iface 和 eface 的区别是什么 4. 接口的动态类型和动态值 ...
- golang 开发常见坑
目录 初级 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 不能使用短变量声明来设置字段值 Can't Use Shor ...
- golang 获取struct类型_聊聊golang的类型断言
序 本文主要研究一下golang的类型断言 类型断言 x.(T) 断言x不为nil且x为T类型 如果T不是接口类型,则该断言x为T类型 如果T类接口类型,则该断言x实现了T接口 实例1 func ma ...
- Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[2]
Go的50坑:新Golang开发者要注意的陷阱.技巧和常见错误[2] 初级篇 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明 ...
- Golang 新手可能会踩的 50 个坑
前言 Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免会遇到很多坑,不过它们大多不是 Go 本身的设计缺陷.如果你刚从其他语言转到 Go,那这篇文章里的坑多半会踩到. 如果花时间学习官方 ...
最新文章
- python的with用法(参考)
- FFMPEG音视频同步-音视频实时采集并编码推流-优化版本
- 如何使用selenium webdriver来判断一个网页加载完毕
- xss挖掘思路分享_新手指南 | permeate靶场漏洞挖掘思路分享
- java $ class_java文件编译后额外生成的$1.class是怎么一回事
- p20怎么用android auto,奔驰23P/P20驾驶辅助系统到底有哪些功能,怎么使用?
- JavaScript 从入门到放弃(二)模块化工具requirejs
- python网络爬虫系列教程——Scrapy框架应用全解
- 一篇文章入门Redis
- 【优化预测】基于matlab麻雀算法优化BP神经网络预测【含Matlab源码 F002期】
- ixigua解析_资本运作系列课程五:《科创板申请上市估值模型理论解析》现场直播回放...
- 据说《算法设计》是算法界三大圣经之一,你读这本书了没?
- 51单片机洞洞板用的visio图_怎样用洞洞板焊接一个向STC80c51或者AT89C51单片机里面烧录程序的电路板?...
- 三种主流芯片架构简单比较
- 微信小程序之授权登录的实现(button按钮)
- 101. 熟悉 Java 并发吗,谈谈对 JUC 线程池 ThreadPoolExecutor 的认识吧
- EKL-日志收集系统安装
- 如何将一段视频做成动图?分享一款视频转gif工具
- 用C语言求平均数的四种方法
- 一个女孩写给monica信 转贴