【发布时间】:2021-10-25 06:37:07
【问题描述】:
#include <utility>
#include <vector>
template <typename Wrapped>
class Wrapper
{
public:
template <typename... Args>
Wrapper(Args&&... args)
: wrapped(std::forward<Args>(args)...)
{
}
private:
Wrapped wrapped;
};
Wrapper<std::vector<int>> intended()
{
std::vector<int>::allocator_type allocator;
return { { 1, 2, 3 }, allocator }; // doesn't compile
}
Wrapper<std::vector<int>> unintended()
{
return 123; // calls 'explicit vector(size_type count)'
}
应该怎么做才能让Wrapper 几乎看不见?例如 - 返回std::vector<int> 不允许这样的函数编译:
std::vector<int> get_vector()
{
return 123; // doesn't compile
}
【问题讨论】:
-
explicit构造函数只能通过调用它来调用,例如return std::vector<int>(123);。在一般情况下,对于任意类和类型,此任务是不可能的。在某些情况下,可以通过继承接口或“Wrapper”应该是“reerence_wapper”。 -
你的构造函数应该是有条件的
explicit。但不完全确定是什么条件。 -
{ 1, 2, 3 }没有类型。所以不能从T&&推导出来(可以从initializer_list或者T(&)[N]推导出来。
标签: c++ constructor wrapper