在空结构中显式声明构造函数有什么意义?

我最近浏览了一个 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({})可能会默默地做错误的事情。在代码中使事情明确而不是隐含的原因可能有很多。


以上是在空结构中显式声明构造函数有什么意义?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>