我正在编写一个类,其中有模板化构造函数和复制构造函数。每次我想使用非常量对象调用复制构造函数时,都会选择模板化构造函数。如何强制编译器选择复制构造函数?
这是 mcve:
#include <iostream>
struct foo
{
foo()
{
std::cout << "def constructor is invoked\n";
}
foo(const foo& other)
{
std::cout << "copy constructor is invoked\n";
}
template <typename T>
foo(T&& value)
{
std::cout << "templated constructor is invoked\n";
}
};
int main()
{
foo first;
foo second(first);
}
删除一个函数不是我想要的。
添加另一个构造函数:
foo(foo& other) : foo( const_cast<const foo&>(other)) // for non-const lvalues
{
}
The first
示例代码中的对象是非常量左值,因此编译器更喜欢foo(foo&)
over foo(const &)
。前者由模板提供(带有T=foo&
),因此被选中。
该解决方案涉及提供一个(非模板)构造函数foo(foo&)
然后通过将其转换为对 const 的引用,将构造委托给复制构造函数
Update,我刚刚意识到foo
右值也将被模板获取。这里有很多选项,但我想最简单的就是添加一个委托foo(foo&&)
,与上面的类似
foo(foo&& other) : foo( const_cast<const foo&>(other)) // for rvalues
{
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)