以下类(带有虚拟析构函数)包含模板化的operator delete:
struct S\n{\n virtual ~S() {}\n template <typename... Args>\n void operator delete(void* ptr, Args... args);\n};\nRun Code Online (Sandbox Code Playgroud)\nargs可以为空,所以我认为S::operator delete也可以在预期常规时使用delete。
但是(使用 g++),我收到错误\xef\xbc\x9a
\n\n\n错误:“S”没有合适的“操作符删除”
\n
难道“合适的‘操作删除’”就不能成为一个模板吗?
\n我正在处理这段代码,并认为在点击构建按钮之前显然不会编译.我很惊讶它不仅编译,而且链接和工作.
如果我猜我会说SFINAE负责编译......是吗?
struct BaseClass
{
public:
BaseClass() {}
template<typename T>
BaseClass(const T& a_other)
{
int i = 0; // for break point
}
template<typename T>
BaseClass& operator= (const T& a_other)
{
int i = 0; // for break point
return *this;
}
private:
BaseClass(const BaseClass& a_other); // Does not have a definition
BaseClass& operator= (const BaseClass& a_other); // Does not have a definition
};
struct MyClass : public BaseClass
{
};
int main()
{
MyClass i, j;
i …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个可复制的类,具体取决于其模板参数(bool Copyable),否则它只能移动。
myclass(myclass&&)当myclass(myclass const&)通过模板参数启用时,它应该可以从类型本身(默认构造函数)构造bool Copyable。
它还可以myclass使用其他模板参数进行构造,我当前的实现通过模板化构造函数和赋值运算符涵盖了这一点。
这里使用零规则通过继承的copyable辅助结构生成默认构造函数和赋值运算符,当为 false 时,该结构将禁用复制构造函数和复制赋值运算符bool Copyable。
template<bool>
struct copyable { };
template <>
struct copyable<false>
{
// Disables copy construct & copy assign
copyable() = default;
copyable(copyable const&) = delete;
copyable(copyable&&) = default;
copyable& operator=(copyable const&) = delete;
copyable& operator=(copyable&&) = default;
};
template<typename A, typename B, typename C>
struct storage_t
{
// Implementation depends on A, B and C
};
template<typename A, typename B, …Run Code Online (Sandbox Code Playgroud) 编辑更新的代码:
class Any
{
public:
Any()
{
}
Any(const Any &other)
{
}
Any(Any &other) // added per Ben's answer
{
}
Any(Any &&other)
{
}
Any(const char *value)
{
}
template<typename T>
Any(const T &value)
{
}
template<typename T>
Any(T &&value)
{
cout << "move ctor" << endl;
}
template<typename T>
Any(const vector<T> &value)
{
}
template<typename T>
Any(vector<T> &&value)
{
}
};
int main(int argc, char *argv[])
{
vector<string> numbers;
numbers.push_back("one");
numbers.push_back("two");
numbers.push_back("three");
numbers.push_back("four");
Any anyNumbers(numbers);
Any …Run Code Online (Sandbox Code Playgroud)