在空结构中显式声明构造函数有什么意义?
我最近浏览了一个 GCC 头文件,发现了这个:
struct defer_lock_t { explicit defer_lock_t() = default; };
为什么构造函数声明为显式而不是空的struct defer_lock_t {}?
我的理解是这种类型与constexpr用于构造函数重载的a一起使用。我对explicit关键字有点模糊,但我想我有点了解它的功能。
回答
关键是defer_lock_t构造从来都不是隐含的。而如果构造函数没有被声明为显式,它将参与隐式构造。
考虑这个例子:
struct explicit_t { explicit explicit_t() = default; };
struct implicit_t { implicit_t() = default; };
void foo(explicit_t){}
void bar(implicit_t){}
int main() {
//foo({}); // implicit - error
foo(explicit_t{}); // explicit - ok
bar({}); // implicit - ok
bar(implicit_t{}); // explicit - ok
}
当explicit_t具有阅读和理解代码所需的重要语义时,这可能是可取的。调用foo({})可能很危险,因为读者不知道实际传递给foo. 当涉及重载解析时,它还可以减轻混淆,并且它应该在选择重载的调用站点上可见。还要考虑foo(explicit_t{})当foos 签名更改时会中断,而foo({})可能会默默地做错误的事情。在代码中使事情明确而不是隐含的原因可能有很多。