我正在写一个类,我有一个模板化的构造函数和复制构造函数.每次我想用非const对象调用复制构造函数时,都会选择模板化构造函数.如何强制编译器选择复制构造函数?
这是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); }
解决方法@H_502_10@
问题是,首先是可变的,所以对它的引用是foo&它与通用参考文献T&& amp;比const foo&更容易.
据推测,你打算T是任何非foo类吗?
在这种情况下,一小部分enable_if chicanery表达了对编译器的意图,而不必编写一系列虚假的重载.
#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,std::enable_if_t<not std::is_base_of<foo,std::decay_t<T>>::value>* = nullptr>
foo(T&& value)
{
std::cout << "templated constructor is invoked\n";
}
};
int main()
{
foo first;
foo second(first);
foo(6);
}
预期产量:
def constructor is invoked
copy constructor is invoked
templated constructor is invoked
据推测,你打算T是任何非foo类吗?
在这种情况下,一小部分enable_if chicanery表达了对编译器的意图,而不必编写一系列虚假的重载.
#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,std::enable_if_t<not std::is_base_of<foo,std::decay_t<T>>::value>* = nullptr> foo(T&& value) { std::cout << "templated constructor is invoked\n"; } }; int main() { foo first; foo second(first); foo(6); }
预期产量:
def constructor is invoked copy constructor is invoked templated constructor is invoked