在C++ 98中,C++编译器可以通过成员方式复制自动生成复制构造函数和复制赋值运算符,例如
struct X {
std::string s;
std::vector<int> v;
int n;
};
Run Code Online (Sandbox Code Playgroud)
编译器使用成员方式复制自动生成复制构造函数和复制赋值运算符X.
但是,C++ 11中的移动语义如何改变?
是否自动生成移动 构造函数和移动 赋值运算符 ,如复制构造函数和复制赋值运算符?
是否存在不自动生成移动操作的情况?
我想阻止我的类的用户将它用作自动变量,所以我编写如下代码:
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 ++ 11标准,只有在以下情况下才会生成默认移动构造函数:
我还能明确默认吗?似乎在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) 所以我读了这篇文章:
默认构造函数和析构函数的“ = 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) 尽管对构造函数使用= default很简单(即在存在其他ctor时强制编译器创建默认构造函数),但我仍然无法理解这两种析构函数之间的区别:
我唯一想到的是group-1析构函数可以定义为虚拟的,而group-2始终是非虚拟的。那么,这是它们之间的唯一区别吗?是否存在编译器未生成析构函数但使用= default强制编译器生成析构函数的情况?
ps我在stackoverflow中检查了很多Q,但是没有一个能回答我的Q。这是一些相关的问题。
(我还不明白根本原因,所以标题可能不正确。)
\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}\nRun Code Online (Sandbox Code Playgroud)\n错误信息是:
\nmain.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)