我问过这个问题,关于使用模板版本重载复制构造函数和赋值运算符并考虑到涉及问题的混淆(因为它似乎是编译器错误),我想我只尝试使用模板复制构造函数和模板赋值运算符来走着瞧吧.但是编译器完全忽略了它们.
struct BaseClass
{
public:
BaseClass() {}
template<typename T>
BaseClass(const T& a_other)
{
int i = 0; // for break point which is not hit
}
template<typename T>
BaseClass& operator= (const T& a_other)
{
int i = 0; // for break point which is not hit
return *this;
}
};
struct MyClass : public BaseClass
{
};
int main()
{
MyClass i, j;
i = j;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么我不能用模板版本覆盖默认值(我怀疑答案是默认值是更好的匹配,但我希望模板版本也可以作为默认值)?我能做些什么来确保调用模板版本而不是默认值?
下面的代码:
#include <new>
#include <iostream>
#include <cstdlib>
struct alignas(32) S
{
S() {throw 1;}
void* operator new(std::size_t count, std::align_val_t al)
{
return ::operator new(count, al);
}
void operator delete(void* ptr, std::align_val_t al)
{
std::cerr << "aligned delete\n";
::operator delete(ptr, al);
}
};
int main()
{
try
{
S* ps = new S;
}
catch(...)
{
}
}
Run Code Online (Sandbox Code Playgroud)
将输出aligned delete.
当然这并没有什么问题。但是,在我添加模板删除后:
struct alignas(32) S
{
...
template <typename... Args>
void operator delete(void* ptr, Args... args)
{
std::cerr << "templated …Run Code Online (Sandbox Code Playgroud)