相关疑难解决方法(0)

自动生成移动操作的规则是什么?

在C++ 98中,C++编译器可以通过成员方式复制自动生成复制构造函数和复制赋值运算符,例如

struct X {
    std::string s;
    std::vector<int> v;
    int n;
};
Run Code Online (Sandbox Code Playgroud)

编译器使用成员方式复制自动生成复制构造函数和复制赋值运算符X.

但是,C++ 11中的移动语义如何改变?

是否自动生成移动 构造函数移动 赋值运算符 ,如复制构造函数和复制赋值运算符?

是否存在自动生成移动操作的情况?

c++ move-semantics c++11

34
推荐指数
2
解决办法
5046
查看次数

"= default"析构函数和空析构函数之间有什么区别?

我想阻止我的类的用户将它用作自动变量,所以我编写如下代码:

class A {
private:
  ~A() = default;
};

int main() {
  A a;
}
Run Code Online (Sandbox Code Playgroud)

我希望代码不会被编译,但是g ++编译它没有错误.

但是,当我将代码更改为:

class A {
private:
  ~A(){}
};

int main() {
  A a;
}
Run Code Online (Sandbox Code Playgroud)

现在,g ++给出了~A()私有的错误,这是我的期望.

"= default"析构函数和空析构函数之间有什么区别?

c++ destructor private class c++11

29
推荐指数
1
解决办法
5991
查看次数

显式默认移动构造函数

根据c ++ 11标准,只有在以下情况下才会生成默认移动构造函数:

  • X没有用户声明的拷贝构造函数,和
  • X没有用户声明的复制赋值运算符,
  • X没有用户声明的移动赋值运算符,
  • X没有用户声明的析构函数,和
  • 移动构造函数不会被隐式定义为已删除.

我还能明确默认吗?似乎在clang中正常工作.像这样例如:

class MyClass {
private:
  std::vector<int> ints;
public:
  MyClass(MyClass const& other) : ints(other.ints) {}
  MyClass(MyClass&& other) = default;
};
Run Code Online (Sandbox Code Playgroud)

c++ constructor clang default-constructor c++11

8
推荐指数
2
解决办法
1633
查看次数

为什么“ = default”析构函数与隐式声明的析构函数不同?

所以我读了这篇文章:

默认构造函数和析构函数的“ = default”与“ {}”有何不同?

其中讨论了原因:

~Widget() = default;
Run Code Online (Sandbox Code Playgroud)

与以下内容不同:

~Widget() {}
Run Code Online (Sandbox Code Playgroud)

但是,“ = default”大小写与隐式声明的大小写也不同。从某种意义上说,= default实际上并没有为您提供默认值,这有点奇怪。

考虑以下程序:

class A
{
public:
    A(std::string str)
    {
        m_str = str;
    } 

    ~A() = default;

    A(A const& rhs)
    {
        printf("Got copied\n");
        m_str = rhs.m_str;
    }

    A(A&& rhs)
    {
        printf("Got moved\n");
        m_str = std::move(rhs.m_str);
    }

    std::string m_str;
};

class B 
{
public:
    B(std::string test) : m_a(test)
    {
    }

    ~B() = default;

    A m_a;
};

int main()
{
    B b("hello world");
    B b2(std::move(b));

    return 0;
} …
Run Code Online (Sandbox Code Playgroud)

c++ destructor

8
推荐指数
1
解决办法
122
查看次数

何时使用= default将析构函数设为默认值?

尽管对构造函数使用= default很简单(即在存在其他ctor时强制编译器创建默认构造函数),但我仍然无法理解这两种析构函数之间的区别:

  1. 那些使用= default的
  2. 那些没有明确定义并由编译器自动生成的代码。

我唯一想到的是group-1析构函数可以定义为虚拟的,而group-2始终是非虚拟的。那么,这是它们之间的唯一区别吗?是否存在编译器未生成析构函数但使用= default强制编译器生成析构函数的情况?

ps我在stackoverflow中检查了很多Q,但是没有一个能回答我的Q。这是一些相关的问题。

  1. = default和{} ctos /析构函数之间的区别
  2. 默认虚拟析构函数
  3. = default和空dtrs之间的区别

c++ destructor c++11

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

C++:当父类具有唯一指针时,隐式转换不起作用

(我还不明白根本原因,所以标题可能不正确。)

\n

我有以下无法编译的 C++ 代码:

\n
#include <iostream>\n#include <memory>\n#include <vector>\n#include <variant>\n#include <optional>\n\ntemplate <typename T>\nclass A {\n public:\n  ~A() = default;\n  std::unique_ptr<int> ptr = nullptr;\n};\n\ntemplate <typename T>\nclass B : public A<std::vector<T>> {\n public:\n  static B<T> Create() {\n    return B<T>();\n  }\n};\n\nusing AllTypes = std::variant<B<int64_t>, B<uint64_t>, B<double>>;\n\nstd::optional<AllTypes> Get() {\n  // Error! No viable conversion!\n  return B<int64_t>::Create();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

错误信息是:

\n
main.cpp: In function \xe2\x80\x98std::optional<std::variant<B<long int>, B<long unsigned int>, B<double> > > Get()\xe2\x80\x99:\nmain.cpp:34:28: error: could not convert \xe2\x80\x98B::Create() [with T = long int]()\xe2\x80\x99 from \xe2\x80\x98B\xe2\x80\x99 …
Run Code Online (Sandbox Code Playgroud)

c++

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