目前,我的一个玩具类模板有两个看起来非常相似的构造函数:
optional(const T& x) { construct(x); } optional(T&& x) { construct(std::move(x)); }
我可以将它们组合成一个构造函数模板,还是会以某种方式改变语义?
template<typename U> optional(U&& x) { construct(std::forward<U>(x)); }
解决方法
它改变了std :: is_constructible和std :: is_convertible等特性与可选项交互的方式.例如给出:
class A {}; int main() { std::cout << std::is_constructible<optional<A>,int>::value << '\n'; };
您的原始代码将打印出来:
0
但是你的新代码将打印出来:
1
如果这是不合需要的,并且您仍然想要使用新代码,则可以启用它以将U限制为可接受的类型.
我看到的唯一其他可能的问题是T是否可以是引用类型(例如int&).在这种情况下,原始代码的第二个构造函数看起来很可疑,因为它将传入rvalue,并且您可能试图将该rvalue绑定到非const左值引用(无法确定).如果T永远不能成为引用类型,则无需担心这一点.
原文地址:https://www.jb51.cc/c/119699.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。