假设我们有以下代码:
我只能这样声明变量:
现在,我工作的人要求我们所有的构造函数都是显式的。 作为一个老家伙,我不喜欢改变我的编码风格,并忘记T blah = ...风格。
问题如下: “有没有一种方法可以使构造函数显式,同时允许复制初始化语法?”
有很好的理由使构造函数显式,大多数情况下,您确实希望使其显式。
在这些情况下,我认为可以采取以下措施:
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&) { ... }
}
请问有没有一种可以使用的技巧,以便创建一个 catch-all 构造函数,禁止所有转换,除了我实际需要的那个。
谢谢。
编辑:根据 Matt McNabb 的答案指出的错字进行了更正。感谢。
T blah = { U() };
并不意味着T blah = { T(U()) };
。复制列表初始化甚至在概念上也不会构造临时的T
。 - T.C.T blah = { U(); }
,因为构造函数是显式的,所以我认为这是因为必须创建一个T
。 - M.M