C++ 显式地将构造函数标记为需要对象类型的

C++ 显式地将构造函数标记为需要对象类型的,c++,explicit,construction,C++,Explicit,Construction,我有一个构造函数,它接受类型为Material的对象: SomeClass::SomeClass( const Material& mat ) ; 但是,材质允许通过向量进行构造: Material::Material( const Vector& v ) ; SomeClass m( vec ) ; // valid, since vec is constructed to a Material first, // then is passed to the SomeCla

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

SomeClass::SomeClass( const Material& mat ) ;
但是,
材质
允许通过
向量
进行构造:

Material::Material( const Vector& v ) ;
SomeClass m( vec ) ; // valid, since vec is constructed to a Material first,
// then is passed to the SomeClass(Material) ctor
因此,
SomeClass
可以允许通过
向量进行构造:

Material::Material( const Vector& v ) ;
SomeClass m( vec ) ; // valid, since vec is constructed to a Material first,
// then is passed to the SomeClass(Material) ctor
然而,在多次使用这种类型的CTOR(在同一项目中的不同类中!)对自己进行“射击”之后,我想禁止直接通过
向量
对象构建
某个类
,而总是要求传递
材质


有办法做到这一点吗?不知何故,你认为这与
显式
关键字有关。

如果不影响你从
向量
透明地构建
材料的能力,你就无法做到这一点

如果您使
材料
的构造函数
显式

explicit Material( const Vector& v ) ;
然后,为了构造一个实例,您将始终必须编写
Material(v)
。这将防止您意外地用
向量
实例化
SomeClass
,但它也会破坏所有计算为
向量
的表达式,其中需要
材质


这是有意义的,因为不声明构造函数
explicit
就是说“无论上下文如何,
向量
材质
一样好”。然后,你不能后退半步说“哦,好吧,除非在构建
SomeClass

时,你不能不干扰你从
向量
透明地构建
材料的能力

如果您使
材料
的构造函数
显式

explicit Material( const Vector& v ) ;
然后,为了构造一个实例,您将始终必须编写
Material(v)
。这将防止您意外地用
向量
实例化
SomeClass
,但它也会破坏所有计算为
向量
的表达式,其中需要
材质

这是有意义的,因为不声明构造函数
explicit
就是说“无论上下文如何,
向量
材质
一样好”。然后,你不能后退半步说“哦,好吧,除非在构造
SomeClass

时,你声明
材料(const Vector&v)
明确的
;这可以防止从一个隐式转换到另一个

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

您将
材质(const Vector&v)
声明为
显式
;这可以防止从一个隐式转换到另一个


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

使
材质的构造函数显式

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

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

使
材料的构造函数显式

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

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

您可以将
Material::Material
构造函数标记为
explicit
。在C++03中,还必须确保
向量
类中没有
操作符材质
。但是,使用C++11还可以将此类转换运算符标记为显式(最好是避免使用转换运算符,而通常通过命名函数提供转换)。干杯,·您可以将
Material::Material
构造函数标记为
explicit
。在C++03中,还必须确保
向量
类中没有
操作符材质
。但是,使用C++11还可以将此类转换运算符标记为显式(最好是避免使用转换运算符,而通常通过命名函数提供转换)。干杯,从构造函数参数中删除
常量
可以达到目的,但这是不可取的。@OliCharlesworth是的,这就是为什么我说这有点像黑客的原因。我只是想让他知道所有的选项,也许他不知道临时变量只能作为
const
引用传递,而不仅仅是引用。从构造函数参数中删除
const
可以达到目标,但不可取。@OliCharlesworth是的,这就是为什么我说这有点麻烦。我只是想让他知道所有选项,也许他不知道临时变量只能作为
const
引用传递,而不仅仅是引用。是的!!这是一个伟大的功能!对这是一个伟大的功能!