C++ 可变参数模板参数:对象不作为引用转发
C++ variadic template arguments: object is not forwarded as a reference
假设我有以下代码:
#include <iostream>
struct NotCopyable
{
std::string value;
NotCopyable(const std::string& str) :
value(str)
{
}
// This struct is not allowed to be copied.
NotCopyable(const NotCopyable&) = delete;
NotCopyable& operator =(const NotCopyable&) = delete;
};
struct Printable
{
NotCopyable& nc;
// This struct is constructed with a reference to a NotCopyable.
Printable(NotCopyable& inNc) :
nc(inNc)
{
}
// So that std::cout can print us:
operator const char*() const
{
return nc.value.c_str();
}
};
// This function constructs an object of type T,
// given some arguments, and prints the object.
template<typename T, typename... ARGS>
void ConstructAndPrint(ARGS... args)
{
T object(std::forward<ARGS>(args)...);
std::cout << "Object says: " << object << std::endl;
}
int main(int, char**)
{
// Create a NotCopyable.
NotCopyable nc("123");
// Try and construct a Printable to print it.
ConstructAndPrint<Printable>(nc); // "Call to deleted constructor of NotCopyable"
// OK then, let's make absolutely sure that we're forwarding a reference.
NotCopyable& ncRef = nc;
// Try again.
ConstructAndPrint<Printable>(ncRef); // "Call to deleted constructor of NotCopyable"
}
似乎 NotCopyable
没有作为参考正确转发,即使我明确提供参考变量作为参数也是如此。为什么是这样?有什么办法可以确保转发的是引用,而不是复制构造的对象?
template<typename T, typename... ARGS>
void ConstructAndPrint(ARGS... args);
按值获取参数,复制也是如此。
您想要转发参考:
// This function constructs an object of type T,
// given some arguments, and prints the object.
template<typename T, typename... ARGS>
void ConstructAndPrint(ARGS&&... args)
{
T object(std::forward<ARGS>(args)...);
std::cout << "Object says: " << object << std::endl;
}
假设我有以下代码:
#include <iostream>
struct NotCopyable
{
std::string value;
NotCopyable(const std::string& str) :
value(str)
{
}
// This struct is not allowed to be copied.
NotCopyable(const NotCopyable&) = delete;
NotCopyable& operator =(const NotCopyable&) = delete;
};
struct Printable
{
NotCopyable& nc;
// This struct is constructed with a reference to a NotCopyable.
Printable(NotCopyable& inNc) :
nc(inNc)
{
}
// So that std::cout can print us:
operator const char*() const
{
return nc.value.c_str();
}
};
// This function constructs an object of type T,
// given some arguments, and prints the object.
template<typename T, typename... ARGS>
void ConstructAndPrint(ARGS... args)
{
T object(std::forward<ARGS>(args)...);
std::cout << "Object says: " << object << std::endl;
}
int main(int, char**)
{
// Create a NotCopyable.
NotCopyable nc("123");
// Try and construct a Printable to print it.
ConstructAndPrint<Printable>(nc); // "Call to deleted constructor of NotCopyable"
// OK then, let's make absolutely sure that we're forwarding a reference.
NotCopyable& ncRef = nc;
// Try again.
ConstructAndPrint<Printable>(ncRef); // "Call to deleted constructor of NotCopyable"
}
似乎 NotCopyable
没有作为参考正确转发,即使我明确提供参考变量作为参数也是如此。为什么是这样?有什么办法可以确保转发的是引用,而不是复制构造的对象?
template<typename T, typename... ARGS>
void ConstructAndPrint(ARGS... args);
按值获取参数,复制也是如此。
您想要转发参考:
// This function constructs an object of type T,
// given some arguments, and prints the object.
template<typename T, typename... ARGS>
void ConstructAndPrint(ARGS&&... args)
{
T object(std::forward<ARGS>(args)...);
std::cout << "Object says: " << object << std::endl;
}