相关疑难解决方法(0)

"放置新"有什么用途?

有没有人曾经使用过C++的"贴牌新品"?如果是这样,那该怎么办?在我看来,它只对内存映射硬件有用.

c++ memory-management placement-new new-operator

385
推荐指数
18
解决办法
16万
查看次数

三阶规则与C++ 11一起成为五次规则?

因此,在观看了关于右值引用的精彩演讲之后,我认为每个类都会受益于这样的"移动构造函数",template<class T> MyClass(T&& other) 编辑,当然还有"移动赋值运算符",template<class T> MyClass& operator=(T&& other)正如Philipp在他的回答中指出的,如果它已经动态分配成员,或通常存储指针.就像你应该有一个copy-ctor,赋值运算符和析构函数,如果之前提到的点适用.思考?

c++ constructor rvalue-reference rule-of-three c++11

325
推荐指数
5
解决办法
7万
查看次数

函数声明后=删除的含义

class my_class
{
    ...
    my_class(my_class const &) = delete;
    ...
};
Run Code Online (Sandbox Code Playgroud)

= delete在这种情况下意味着什么?

还有其他"修饰符"(除了= 0= delete)吗?

c++ declaration function delete-operator c++11

224
推荐指数
6
解决办法
10万
查看次数

类"函数声明"后"默认"是什么意思?

我见过default在类中的函数声明旁边使用过.它有什么作用?

class C {
  C(const C&) = default;
  C(C&&) = default;
  C& operator=(const C&) & = default;
  C& operator=(C&&) & = default;
  virtual ~C() { }
};
Run Code Online (Sandbox Code Playgroud)

c++ default declaration keyword c++11

202
推荐指数
4
解决办法
8万
查看次数

对于默认构造函数和析构函数,"= default"与"{}"有什么不同?

我最初发布这个只是关于析构函数的问题,但现在我正在添加对默认构造函数的考虑.这是原始问题:

如果我想给我的类一个虚拟的析构函数,但是与编译器生成的析构函数相同,我可以使用 =default:

class Widget {
public:
   virtual ~Widget() = default;
};
Run Code Online (Sandbox Code Playgroud)

但似乎我可以通过使用空定义减少输入来获得相同的效果:

class Widget {
public:
   virtual ~Widget() {}
};
Run Code Online (Sandbox Code Playgroud)

这两种定义的行为方式有何不同?

根据此问题的回复,默认构造函数的情况似乎相似.鉴于析构函数的" =default"和" {}"之间的含义几乎没有差异,默认构造函数的这些选项之间的含义几乎没有差别吗?也就是说,假设我想创建一个类型,其中该类型的对象将被创建和销毁,为什么我要说

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

代替

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

如果在原始帖子违反某些SO规则后延长此问题,我深表歉意.为默认构造函数发布一个几乎完全相同的问题让我觉得不太理想.

c++ user-defined-functions default-constructor deleted-functions c++11

151
推荐指数
3
解决办法
3万
查看次数

使用非平凡的构造函数初始化联合

我有一个结构,我创建一个自定义构造函数来将成员初始化为0.我在较旧的编译器中看到,当处于释放模式时,如果没有将memset设置为0,则不会初始化值.

我现在想在union中使用这个结构,但是因为它有一个非平凡的构造函数而得到错误.

那么,问题1.默认编译器实现的构造函数是否保证结构的所有成员都将为null初始化?非平凡的构造函数只是将所有成员的memset设置为'0'以确保结构清晰.

问题2:如果必须在基础结构上指定构造函数,如何实现联合以包含该元素并确保0初始化的基本元素?

c++ constructor multiplatform

55
推荐指数
2
解决办法
5万
查看次数

构造函数“=default”和C++中编译器生成的构造函数有什么区别?

代码示例:

class Dog
{
private:
    int x;
public:
    Dog()=default;
};
Run Code Online (Sandbox Code Playgroud)

对比 这段代码:

class Dog
{
private:
    int x;
};
Run Code Online (Sandbox Code Playgroud)

“=default”的构造函数(第一个代码)和编译器创建的构造函数(如第二个代码)有什么区别?

c++ constructor default-constructor

41
推荐指数
3
解决办法
3245
查看次数

如果显式默认或删除了构造函数,为什么自C ++ 20起聚合初始化不再起作用?

我正在将C ++ Visual Studio项目从VS2017迁移到VS2019。

我现在遇到一个错误,以前没有发生过,可以通过以下几行代码来重现:

struct Foo
{
    Foo() = default;
    int bar;
};
auto test = Foo { 0 };
Run Code Online (Sandbox Code Playgroud)

错误是

(6):错误C2440:“正在初始化”:无法从“初始化列表”转换为“ Foo”

(6):注意:没有构造函数可以采用源类型,或者构造函数重载解析度不明确

该项目用/std:c++latest标志编译。我把它复制在了哥德螺栓上。如果我将其切换到/std:c++17,它可以像以前一样正常编译。

我试图用clang编译相同的代码,-std=c++2a并得到了类似的错误。同样,默认或删除其他构造函数也会产生此错误。

显然,VS2019中添加了一些新的C ++ 20功能,我假设在https://en.cppreference.com/w/cpp/language/aggregate_initialization中描述了此问题的起源。在那里,它表示一个聚合可以是(除其他条件外)具有的结构

  • 没有用户提供的,继承的或显式的构造函数(允许使用显式默认或删除的构造函数)(自C ++ 17起)(直到C ++ 20)
  • 没有用户声明或继承的构造函数(自C ++ 20起)

请注意,括号中的部分“明确允许使用默认或删除的构造函数”已删除,并且“用户提供”更改为“用户声明”。

因此,我的第一个问题是,我是否假设标准的这种更改是我的代码以前编译但现在不再编译的原因?

当然,解决此问题很容易:只需删除显式默认的构造函数即可。

但是,我已经在所有项目中明确地默认并删除了很多构造函数,因为我发现以这种方式使代码更具表现力是一个好习惯,因为与隐式默认或删除的构造函数相比,这样做只会带来更少的惊喜。但是,通过这种更改,这似乎不再是一个好习惯了...

所以我的实际问题是: 从C ++ 17到C ++ 20的变化背后的原因什么?向后兼容的突破是故意的吗?是否有一些折衷办法,例如“确定,我们在这里破坏了向后兼容性,但这是为了更大的利益。”吗?这个更大的好处是什么?

c++ backwards-compatibility c++17 c++20

21
推荐指数
3
解决办法
1022
查看次数

默认的默认构造函数是否将变量初始化为零?

我正在将类更新为C++ 14,并试图找出在构造时将所有实例变量初始化为零的最简单方法.这是我到目前为止所拥有的:

class MyClass {
public:
    int var;
    float* ptr;
    double array[3];
    MyStruct data;
    unique_ptr<MyStruct> smart_ptr;

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

将构造函数设置为default等效于:

MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {}
Run Code Online (Sandbox Code Playgroud)

...或者我需要初始化每个变量吗?(我已经在Visual Studio中尝试了两种方式,但无论如何我都会得到零,但我不确定这是不是运气.)

我没有括号实例化课程: MyClass obj;

c++ constructor c++14

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

是否保证默认构造函数自动将内置类型初始化为0?

在你开始将其标记为重复之前,我已经读过这个 .但它没有回答我的问题.链接的问题谈到了C++ 98和C++ 03,但我的问题是关于C++ 11引入的默认构造函数.

考虑以下程序(请参阅此处的实时演示):

#include <iostream>
struct Test
{
    int s;
    float m;
    Test(int a,float b) : s(a),m(b)
    { }
    Test()=default;
}t;
int main()
{
    std::cout<<t.s<<'\n';
    std::cout<<t.m<<'\n';
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,编译器提供的默认构造函数总是初始化内置类型,在C++ 11和C++ 14中默认为0,当它们是class&struct成员时.这种行为是否由C++ 11标准保证?

c++ initialization default-constructor language-lawyer c++11

11
推荐指数
3
解决办法
1058
查看次数