oop*_*psi 35 c++ constructor defensive-programming explicit
阅读以下博客后:
http://xania.org/200711/ambiguous-overloading
我开始问自己"我不应该总是明确地定义我的构造函数吗?"
所以我开始阅读的不仅仅是发现这篇文章:
http://www.sjbrown.co.uk/2004/05/01/always-use-explicit/
这显示了另一个例子,也解释了他背后的想法.但当然这是博客的一个想法.
我很高兴听到你们中的一些人,你对这种态度的看法,你对这个主题的经验是什么,以及对于任何一种方式的一些例子都会很好.
Luc*_*ton 57
传统观点认为,应该标记构造函数采用一个参数(通过使用默认参数明确地或有效地)explicit,除非它们确实定义了转换(std::string可以从const char*后者的一个示例转换).你已经弄清楚了自己的原因,因为隐含的转换确实会使生活变得更加艰难.
一个可能明显的例外是复制构造函数.或者另一种方法是考虑大多数类型都可以从自身转换为自身,并且因此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 };
}
Run Code Online (Sandbox Code Playgroud)
我个人发现,在一个返回的函数中,foo我必须明确地返回它foo { 42, 42, 42 }.我不知道explicit是什么在保护我.我真的希望{ initializers... }语法的意思是"从给定的初始化器构造对象",并explicit在避免任何事情的同时解决这个问题.(因为在复制初始化的情况下{ i }归结为i- 大部分时间 - 我很乐意将其提升.)
所以我要说养成使用explicit一元构造函数的习惯,只有那些.
| 归档时间: |
|
| 查看次数: |
18854 次 |
| 最近记录: |