组合复制和移动的两个构造函数
combining two constructors that copy and move
目前,我的一个玩具类模板有两个看起来非常相似的构造函数:
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
等性状与optional
相互作用的方式。例如:
class A {};
int main()
{
std::cout << std::is_constructible<optional<A>, int>::value << 'n';
};
您的原始代码将打印出来:
0
但你的新代码会打印出来:
1
如果这是不可取的,并且您仍然希望使用新代码,您可以enable_if
它来将U
限制为可接受的类型。
我看到的唯一其他可能的问题是T
是否可以是引用类型(例如int&
(。在这种情况下,原始代码的第二个构造函数看起来很可疑,因为它将传递一个右值,并且您可能试图将该右值绑定到一个非常量左值引用(不能确定(。如果T
永远不可能是引用类型,则无需担心这一点。
哦,construct不是构造函数,它是成员函数模板。
那么语义可能会有所不同。原始重载集将左值引用传递给常量,或将右值引用传递到非常量。模板版本还可以将左值引用传递给non-const。(我忽略了对常量的右值引用。(
尽管construct
很可能被声明为接受U&&
(否则你之前移动T
的重载将不起作用(,并且在这种情况下应该处理非常值,或者被声明为接收U const&
,在这种情况中它是无害的。
假设您至少定义了construct(const T& x)
,可能还定义了construct(T&& x)
的加法,并且您的U
类型的对象可以转换为T
类型的对象,我认为您应该没事。。。
U
类型的常量l值引用将绑定到construct(const T& x)
U
类型的非常量l值引用将绑定到construct(const T& x)
- 如果未定义r值引用版本,则类型为
U
的临时r值将绑定到construct(T&& x)
或construct(const T& x)
U
类型的常量r值引用将绑定到construct(const T& x)
相关文章:
- C++如果两个模板函数都与参数列表匹配,将调用哪个模板
- 用相同的参数声明两个构造函数的最偶像化的方法是什么?
- 当我链接两个静态C++库时,我可以在两个主函数库中有两个主要功能吗?
- 静态类属性,C++中的多个构造函数
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- pair的两个构造函数几乎相同,为什么不生成构建错误?
- 为什么<T> LLVM 中的预期为 Expect&&... 实现两个构造函数<T>?
- 为什么我的类只适用于两个构造函数 C++
- 两个构造函数(带和不带参数),没有输入 -> 没有参数运行。跳过上述类中的构造函数
- 类介绍 (c++) 项目希望我们创建两个构造函数,但它们都不需要任何参数 - 我应该在这里做什么?
- 除了两个构造函数外,C++库导入也可以工作
- 在两个构造函数之前将我的静态数据成员在 CPP 文件中初始化为 0
- 如何有条件地在具有相同签名的两个构造函数之间切换
- RAII 在两个构造函数之间进行选择的方式
- 具有两个构造函数的抽象类
- 这两个构造函数调用之间的区别
- 为什么在我的程序中调用两个构造函数
- 组合复制和移动的两个构造函数
- 为什么这两个构造函数一起不会产生歧义错误?
- 在两个构造函数之间进行选择