将构造函数标记为__exlicitly__,需要对象类型

时间:2011-12-09 02:55:43

标签: c++ explicit construction

我有一个接受Material类型的对象的构造函数:

SomeClass::SomeClass( const Material& mat ) ;

但是,Material允许Vector

构建
Material::Material( const Vector& v ) ;

因此,SomeClass可以允许Vector

构建
SomeClass m( vec ) ; // valid, since vec is constructed to a Material first,
// then is passed to the SomeClass(Material) ctor

然而,在使用此类的ctors (在同一个项目中的不同类别中)不止一次“用脚射击”之后我想要禁止构建直接SomeClassVector对象,而不是总是需要传递Material

有办法做到这一点吗?不知何故认为它与explicit关键字有关。

3 个答案:

答案 0 :(得分:2)

您声明Material(const Vector &v)explicit;这可以防止从一个隐式转换到另一个。

这当然不是对SomeClass的具体限制;它是对任何隐式转换实例的全局禁令。

答案 1 :(得分:1)

如果不干扰您从Material透明地构建Vector的能力,则无法执行此操作。

如果你使Material的构造函数explicit

explicit Material( const Vector& v ) ;

然后你总是必须编写Material(v)才能构造一个实例。这会阻止您使用SomeClass意外地Vector实例化,但它也会将所有评估为Vector的表达式分解为预期Material

这是有道理的,因为通过不声明构造函数explicit,你说“无论上下文是什么,VectorMaterial一样好”。然后你不能向后半步说“哦,好吧,除了构建SomeClass时”。

答案 2 :(得分:1)

制作Material explicit的构造函数:

explicit Material(const Vector& v) { ... }

或者,如果您不想这样做,作为一个黑客并const - 作为牺牲的正确性,请从const移除const Material& mat。您将无法将临时对象传递给SomeClass(或const实例的构造函数,这可能是一个太大的牺牲)。但是,这使您无法执行您可能想要执行的SomeClass(Material(v))。所以你只能接近你想要的东西,但我担心这不是完全可能的。