【发布时间】:2015-07-13 09:54:45
【问题描述】:
假设我们有类似的东西:
class U {
...
}
和:
class T {
T(const U&) { ... }
}
现在我可以像这样声明一个变量:
U foo; 然后 T blah(foo); 或 T blah = foo
我个人更喜欢后者。
现在,我应该将 T 复制构造函数更改为:
class T {
explicit T(const U&) { ... }
}
我只能声明一个变量,例如:
T blah(foo); T blah = foo; 会给我一个关于无法将 U 转换为 T 的编译错误。
http://en.cppreference.com/w/cpp/language/explicit 解释了这种行为: “指定不允许隐式转换或复制初始化的构造函数和(C++11 起)转换运算符。”
现在,我为之工作的人要求我们所有的构造函数都是显式的。 作为一个老屁,我不喜欢过多地改变我的编码风格而忘记了 T blah = ... 风格。
这样的问题是这样的: “有没有办法在允许复制初始化语法的同时使构造函数显式?”
将构造函数显式化有很好的理由,而且大多数时候,您确实希望使其显式化。
在这些情况下,我认为我可以做一些事情:
class T {
template<typename = V>
T(const V&) = delete;
T(const U&) { ... }
}
这将是一个包罗万象的构造函数,禁止所有转换,但我真正想要的。
想知道我是否可以使用一些技巧。
谢谢
编辑:更正了 Matt McNabb 回答所指出的错字。谢谢
【问题讨论】: