下面的代码打印nullptr
而不是empty
(godbolt link):
#include <iostream>
class empty { };
#if 1
void f(std::nullptr_t) {
std::cout << "nullptr\n";
}
#endif
void f(empty) {
std::cout << "empty\n";
}
int main() {
f({});
}
字符串
禁用f(nullptr_t)
变体会导致empty
被打印。当empty
变体和nullptr_t
变体都可用时,C++使用什么规则来选择nullptr_t
变体而不是empty
变体?
1条答案
按热度按时间tez616oj1#
用
{}
初始化std::nullptr_t
(或任何其他基本类型)更好,因为它会导致标识转换,而初始化类类型会导致用户定义的转换序列:否则,如果参数的聚合类型可以根据聚合初始化规则([dcl.init.aggr])从初始化器列表中初始化,则隐式转换序列是用户定义的转换序列,其第二个标准转换序列是单位转换。
empty
是一个聚合类型,所以这一段适用。std::nullptr_t
不是一个类,所以下面的段落适用:否则,如果参数类型不是类:
over.best.ics(https://eel.is/c++draft/over.best.ics)解释了哪种隐式转换序列更好,但很明显,标识转换优于其他转换。