gpt4 book ai didi

C++ 总是使用显式构造函数

转载 作者:IT老高 更新时间:2023-10-28 12:37:12 26 4
gpt4 key购买 nike

阅读以下博客后:

http://xania.org/200711/ambiguous-overloading

我开始问自己“我不应该总是明确定义我的构造函数吗?”

所以我开始阅读比发现这篇文章更多的内容:

http://www.sjbrown.co.uk/2004/05/01/always-use-explicit/

这显示了另一个例子,也解释了他背后的想法。但这当然是一位博主的想法。

我很高兴听到你们中的一些人的意见,你对这种方式的看法,你对该主题的体验以及任何一种方式的一些例子都会很好。

最佳答案

传统观点认为构造函数采用一个参数(通过使用默认参数显式或有效地)应该标记为显式,除非它们确实定义了转换(std::string 可从 const char* 转换为后者的一个示例)。您自己已经弄清楚了原因,因为隐式转换确实会使生活变得比它必须的更难。

复制构造函数可能是一个明显的异常(exception)。或者也许另一种方式是考虑大多数类型可以相互转换,因此复制构造函数大部分时间都没有标记为 explicit

虽然标记所有其他类型的构造函数 explicit 似乎并没有什么坏处,但我反对它。因为虽然 explicit 在 C++03 中对采用多个参数的构造函数没有影响,但它在 C++11 中确实有效。将其放入代码中:

struct foo {
explicit foo(int i);
foo(int i, int j);
explicit foo(int i, int j, int k);
};

foo make_foo()
{
/* Not C++11-specific: */
// Error: no conversion from int to foo
return 42;

// Okay: construction, not conversion
return foo(42);

// Okay: constructions
return foo(42, 42);
return foo(42, 42, 42);

/* C++11 specific: */
// Error: no conversion from int to foo
return { 42 };

// Not an error, not a conversion
return { 42, 42 };

// Error! Constructor is explicit
return { 42, 42, 42 };
// Not an error, direct-initialization syntax
return foo { 42, 42, 42 };
}

我个人觉得在返回 foo 的函数中我必须显式返回 foo { 42, 42, 42 } 是不必要的冗长。我看不到 explicit 是什么保护了我。我真的希望 { initializers... } 语法意味着“从给定的初始化程序构造对象”,而 explicit 进入了这种方式,同时使我一无所有。 (因为 { i } 在复制初始化的上下文中确实归结为 i - 大多数时候 - 我很乐意放弃它。)

所以我想说养成将explicit用于一元构造函数的习惯,只有那些

关于C++ 总是使用显式构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12437241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com