相关疑难解决方法(0)

=default 和没有参数的空构造函数之间的区别?

=default 和没有参数的空构造函数之间的区别?

是否有区别:

MyClass() {}
MyClass() = default;
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

何时以及如何默认初始化const变量?

clang++没有用户定义的构造函数,它不允许默认初始化类型的const变量 ; g++限制性稍差(见下文).根据这个答案,这是因为POD类型"默认情况下没有初始化".如果我理解正确,这意味着默认初始化不会调用默认构造函数,也不会调用值初始化,因此POD类型中的数据成员不会被初始化.当然,使用带有未初始化值的const POD类型是没有意义的,因为它们永远不会被初始化,因此使用起来不安全.

这种情况有一些变种:

  1. 该类型在技术上是"POD",但不包含数据成员(仅限函数).(clang++并不认为这是一种特殊情况,我认为也不是标准的,但g++也允许它,即使构造函数被标记explicit.)
  2. 使用定义空构造函数{}.(这是clang描述问题的页面上的推荐解决方法.)
  3. 声明了默认构造函数=default.(C++ 11以后;类型仍然被认为是POD,因此编译器和标准都不会将其视为特殊情况.)
  4. 使用显式调用聚合初始化{},(如果我理解正确)变为值初始化.(C++ 11以后;两个编译器 - 我认为,标准 - 允许这个.)

在第一种情况下,可能没有未初始化的成员,因此不清楚为什么任何类本身的实例化都将被视为"未初始化",而不管它是否是const.既然g++允许这种行为,使用安全吗?为什么禁止clang++和标准?(还有其他任何情况g++允许POD默认初始化哪里clang++没有?)

在第二和第三种情况下,使用{}代替的要求=default对我来说似乎很奇怪.编辑: 这个问题很好地解释了差异,所以我已经删除了询问区别的部分问题.(尽管如此,我仍然认为这是一种非常令人困惑的语言方面.)

最后,将Foo f{}始终是零初始化内置类型的成员如果Foo::Foo(void){},=default或隐式声明的?

c++ constructor default-constructor c++11

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

Gcc失败了,"超载的召唤是暧昧的"而clang没有

我有以下代码:

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

你可以在godbolt试一试.

如果我用clang(3.8.0)编译它:
clang++ oload.cpp -std=c++1y
一切运行正常.

如果我用gcc(6.1.1 20160602)编译它
g++ oload.cpp -std=c++1y
我得到:

oload.cpp: In function ‘int main()’:
oload.cpp:30:29: error: call of overloaded ‘value(<brace-enclosed initializer list>)’ …
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang

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

默认构造函数与隐式构造函数

可能有人已经问过这个问题,但在谷歌上搜索“默认”、“默认”、“明确”等并没有给出好的结果。但无论如何。

我已经知道显式定义的默认构造函数(即没有参数)和显式定义的默认构造函数(即带有关键字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;而不是完全省略构造函数(当然,假设它是该类唯一明确定义的构造函数)。

c++ constructor default-constructor

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

在类中的构造函数或运算符重载(例如:复制赋值运算符)声明的末尾键入 `= 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)

c++ constructor default default-constructor

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

C++无法实现默认构造函数

我有以下课程:

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&)=默认值;

有没有办法解决它?我做错了什么?我发现了一些关于默认值的文章,但没有任何可以帮我修复这些错误的文章.

c++ constructor

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

未定义引用构造函数问题

请参阅下面给出的代码

#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_3num_3()main 函数替换。

c++ oop constructor class c++11

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

C++ 11 - CTOR()= default和empty CTOR(){}之间有什么区别?

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)

有人可以开导我吗?

c++ c++11

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

标签 统计

c++ ×8

constructor ×5

c++11 ×4

default-constructor ×3

clang ×1

class ×1

default ×1

gcc ×1

oop ×1