空点的类型是什么
What is the type of nullptr?
标准声明,nullptr
是类型为 std::nullptr_t
(2.14.7( 的指针文本。18.2p9 定义nullptr_t
namespace std {
typedef decltype(nullptr) nullptr_t;
}
7.1.6.2p4 decltype(nullptr)
是表达式的类型nullptr
,根据定义,它是std::nullptr_t
(因为表达式nullptr
是一个 prvalue(。将其代入nullptr_t
的定义中
typedef nullptr_t nullptr_t
另一方面,typedef 说明符不会引入新类型,它只是另一个现有类型的名称。那么,究竟什么是nullptr_t
?我无法理解这些定义。
它是特定于实现的。重要的是(C++11标准第18.2/9页(:
[...]
nullptr_t
是其同义词的类型具有 3.9.1 和 4.10 中所述的特征。[...]
只要它的行为像标准在这两段中指定的那样,它可以是任何东西。
我相信你论点中的逻辑谬误是:
7.1.6.2p4
decltype(nullptr)
是表达式的类型nullptr
,根据定义std::nullptr_t
(因为表达式nullptr
是一个 prvalue(
并不意味着nullptr_t
不是类型别名。例如,如果我定义:
typedef decltype(42) foo;
我可以说表达式的类型:
42
是foo
.然而,foo
只是另一种类型的别名(int
(。
内部有一个实体是空指针常量类型。 它是基本类型之一。
关键字、文字和表达式nullptr
具有此类型。 decltype(nullptr)
指的是这种类型。
但是,名称std::nullptr_t
不是关键字(甚至不是上下文相关的关键字(,因此该名称在声明之前不存在。 如果您引用名称std::nullptr_t
而不声明它,则与任何未声明的名称一样,这是一个错误。
因此,尽管类型像任何基本类型一样存在于翻译开始时,但名称并不存在。
实际上,还有其他基本类型没有"单一拼写",例如short int。 短 int 可以称为 short
、short int
、signed short int
、signed short
或其任何排列。
它也与typeid
运算符(关键字(与typeid(...)
表达式的类型之间的关系std::typeinfo
不同。 typeinfo
也不是关键字,并且在声明之前不存在该名称。
基本上,您将实体(空指针常量类型(与名称(std::nullptr_t
(混为一谈
如果你问为什么语言设计者不指定nullptr_t
和typeinfo
作为关键字,我会推测它们不够常见,不会冒着与具有相同拼写的用户定义名称发生名称冲突的风险。 回想一下,此类冲突将发生在任何和所有范围内。
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 这在C++是什么类型的错误?
- int(int)& 或 int(int) const &是什么类型?
- 我如何找出3D容器的元素是什么类型
- 在 c 和 c++ 中,二维数组的元素是什么类型?
- 这个 lambda 的参数是什么类型?
- 转换逻辑目标是什么类型
- 如果我创建一个修改值的迭代器,静态成员"reference"应该是什么类型?
- 这是什么类型的行为
- 给定以下内容,"function"是什么类型?
- C++:文本文件中的数据是什么类型的
- C++11 中的"auto var = {condition} ? 1 : 1.0"是什么类型?是双精度还是整数?
- C++中的 decltype(this) 是什么类型
- 如何知道模板<类型名称类型>是什么类型?
- 内置数组的大小是什么类型?
- c++ 11中的std::chrono::high_resolution_clock::now()是什么类型?
- 在Microsoft Visual C++中,光线跟踪器应该是什么类型的项目
- 如何为delete编写一个C包装器,既快速又释放给定的任何类型,而不告诉它是什么类型
- 如何编写一个函数,无论数组是什么类型都输出它