=default 和没有参数的空构造函数之间的区别?
是否有区别:
MyClass() {}
MyClass() = default;
Run Code Online (Sandbox Code Playgroud) clang++没有用户定义的构造函数,它不允许默认初始化类型的const变量 ; g++限制性稍差(见下文).根据这个答案,这是因为POD类型"默认情况下没有初始化".如果我理解正确,这意味着默认初始化不会调用默认构造函数,也不会调用值初始化,因此POD类型中的数据成员不会被初始化.当然,使用带有未初始化值的const POD类型是没有意义的,因为它们永远不会被初始化,因此使用起来不安全.
这种情况有一些变种:
clang++并不认为这是一种特殊情况,我认为也不是标准的,但g++也允许它,即使构造函数被标记explicit.){}.(这是clang描述问题的页面上的推荐解决方法.)=default.(C++ 11以后;类型仍然被认为是POD,因此编译器和标准都不会将其视为特殊情况.){},(如果我理解正确)变为值初始化.(C++ 11以后;两个编译器 - 我认为,标准 - 允许这个.)在第一种情况下,可能没有未初始化的成员,因此不清楚为什么任何类本身的实例化都将被视为"未初始化",而不管它是否是const.既然g++允许这种行为,使用安全吗?为什么禁止clang++和标准?(还有其他任何情况g++允许POD默认初始化哪里clang++没有?)
在第二和第三种情况下,使用{}代替的要求=default对我来说似乎很奇怪.编辑: 这个问题很好地解释了差异,所以我已经删除了询问区别的部分问题.(尽管如此,我仍然认为这是一种非常令人困惑的语言方面.)
最后,将Foo f{}始终是零初始化内置类型的成员如果Foo::Foo(void)是{},=default或隐式声明的?
我有以下代码:
#include <experimental/string_view>
struct b_symbol {
template <typename T>
explicit b_symbol(T&& symbol)
: symbol(std::forward<T>(symbol)) {
}
std::experimental::string_view symbol;
};
struct b_utf8 {
template <typename T>
explicit b_utf8(T&& value)
: value(std::forward<T>(value)) {
}
std::experimental::string_view value;
};
struct value {
explicit value(b_utf8) {}
explicit value(b_symbol) {}
};
int main() {
value v({b_utf8("test")});
}
Run Code Online (Sandbox Code Playgroud)
如果我用clang(3.8.0)编译它:
clang++ oload.cpp -std=c++1y
一切运行正常.
如果我用gcc(6.1.1 20160602)编译它
g++ oload.cpp -std=c++1y
我得到:
Run Code Online (Sandbox Code Playgroud)oload.cpp: In function ‘int main()’: oload.cpp:30:29: error: call of overloaded ‘value(<brace-enclosed initializer list>)’ …
可能有人已经问过这个问题,但在谷歌上搜索“默认”、“默认”、“明确”等并没有给出好的结果。但无论如何。
我已经知道显式定义的默认构造函数(即没有参数)和显式定义的默认构造函数(即带有关键字default)之间存在一些差异,从这里开始:C++11 中的新关键字 =default
但是显式定义的默认构造函数和隐式定义的构造函数(即当用户根本不编写它时)之间有什么区别?
class A
{
public:
A() = default;
// other stuff
};
Run Code Online (Sandbox Code Playgroud)
对比
class A
{
// other stuff
};
Run Code Online (Sandbox Code Playgroud)
想到的一件事是,当存在非默认构造函数时,用户还必须明确定义默认构造函数。但是还有其他区别吗?
编辑:我最感兴趣的是知道是否有任何充分的理由来编写A() = default;而不是完全省略构造函数(当然,假设它是该类唯一明确定义的构造函数)。
这个答案是什么是三的规则?有以下代码。请注意,除了第一个构造函数之外,所有构造函数= default;的末尾都有:
class person
{
std::string name;
int age;
public:
person(const std::string& name, int age); // Ctor
person(const person &) = default; // 1/5: Copy Ctor
person(person &&) noexcept = default; // 4/5: Move Ctor
person& operator=(const person &) = default; // 2/5: Copy Assignment
person& operator=(person &&) noexcept = default; // 5/5: Move Assignment
~person() noexcept = default; // 3/5: Dtor
};
Run Code Online (Sandbox Code Playgroud)
虽然我以前见过很多次,但我不明白什么时候可以使用= default,或者为什么。在我看来,如果您想要defaultC++ 提供的构造函数或赋值运算符,您可以只删除该声明(以及任何相关的定义),不是吗?
明确禁止给定类型的任何其他构造函数的目的是什么?例如:也许这个
person& operator=(const person &) …Run Code Online (Sandbox Code Playgroud) 我有以下课程:
class Fraction {
private:
int x;
int y;
public:
// Constructors
Fraction(long x = 0, long y = 1);
Fraction(const Fraction&)=default;//here is the problem
virtual ~Fraction();
};
Run Code Online (Sandbox Code Playgroud)
我正在尝试禁用默认的C++构造函数来实现我自己的(我打算用它来复制).所以,我宣布它是默认的.但是,当我试图实现它时:
Fraction::Fraction(const Fraction&){}
Run Code Online (Sandbox Code Playgroud)
编译器向我抛出以下错误:
./src/Fraction.cpp:16:1:错误:显式默认定义'Fraction :: Fraction(const Fraction&)'Fraction :: Fraction(const Fraction&){^包含在../src/Fraction文件中. cpp:8:0:../ src/Images.h:22:2:错误:'Fraction :: Fraction(const Fraction&)'在此明确默认为Fraction(const Fraction&)=默认值;
有没有办法解决它?我做错了什么?我发现了一些关于默认值的文章,但没有任何可以帮我修复这些错误的文章.
请参阅下面给出的代码
#include <iostream>
using namespace std;
class Number
{
int a;
public:
Number();
Number(int num_1) {
a = num_1;
}
void print_number(void) { cout << "Value of a is " << a << endl; }
};
int main()
{
Number num_1(33), num_3;
Number num_2(num_1);
num_2.print_number();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我在同一个类中有 2 个构造函数,但是在编译它时,给了我错误
ccnd0o9C.o:xx.cpp:(.text+0x30): undefined reference to `Number::Number()'
collect2.exe: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
有人能解决这个问题吗?我仍然需要 2 个构造函数,但不需要num_3 用num_3()main 函数替换。
C++ 11引入了新的关键字default来强制创建默认构造函数:
class MyClass {
MyClass() = default; // <==
MyClass(int num);
};
Run Code Online (Sandbox Code Playgroud)
我找不到在空构造函数上使用它的原因.
class MyClass {
MyClass() {} // <==
MyClass(int num);
};
Run Code Online (Sandbox Code Playgroud)
有人可以开导我吗?