相关疑难解决方法(0)

为什么我不能用C++中的模板版本覆盖默认的复制构造函数和赋值运算符

我问过这个问题,关于使用模板版本重载复制构造函数和赋值运算符并考虑到涉及问题的混淆(因为它似乎是编译器错误),我想我只尝试使用模板复制构造函数和模板赋值运算符来走着瞧吧.但是编译器完全忽略了它们.

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)

为什么我不能用模板版本覆盖默认值(我怀疑答案是默认值是更好的匹配,但我希望模板版本也可以作为默认值)?我能做些什么来确保调用模板版本而不是默认值?

c++ templates default-constructor

6
推荐指数
2
解决办法
1454
查看次数

当对象的初始化创建的新表达式通过抛出异常终止时调用释放函数的查找

下面的代码:

#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)

c++ new-operator language-lawyer delete-operator

5
推荐指数
1
解决办法
141
查看次数