相关疑难解决方法(0)

C ++ 17中不可复制变量的成员初始化

在对不可复制变量(例如std::atomic<int>)执行成员初始化时,需要使用direct-initialization而不是copy-initialization根据此处的答案。然而,当我打开-std=c++17g++ 7.4.0,似乎后者也是行之有效的。

#include <atomic>

class A {
    std::atomic<int> a = 0;     // copy-initialization
    std::atomic<int> b{0};      // direct-initialization
};
Run Code Online (Sandbox Code Playgroud)
$ g++ -c atomic.cc -std=c++11    // or c++14
atomic.cc:4:26: error: use of deleted function ‘std::atomic<int>::atomic(const std::atomic<int>&)’
     std::atomic<int> a = 0;     // copy-initialization

$ g++ -c atomic.cc -std=c++17
// no error
Run Code Online (Sandbox Code Playgroud)

与编译时,它也没有g++ 6.5.0,甚至有-std=c++17。这里哪一个是正确的?

c++ initialization language-lawyer copy-elision c++17

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

C++构造函数语法

简单问题:以下陈述是否相同?或者是第二个在幕后做更隐含的事情(如果是这样的话,是什么?)

myClass x(3);
myClass x = myClass(3);
Run Code Online (Sandbox Code Playgroud)

谢谢!

c++ constructor

12
推荐指数
3
解决办法
6372
查看次数

如何使用已删除的复制构造函数初始化类数组(C++ 11)

关于为什么我不能初始化对象数组(如果它们有私有拷贝构造函数)的现有问题特指C++ 03.我从那个问题中知道我在C++ 03中不允许做什么,但我认为它应该可以在C++ 11中实现

我有一个不可移动的类(称之为Child),我需要在另一个类的构造函数中初始化一个Child数组(称之为Parent)."不可移动"是指在该对象的生命周期内,Child对象的地址必须保持不变.这样做的正确方法是什么?

使用C++ 11,我尝试了以下内容:

class Child
{
public:
    Child (int x) {}
    ~Child () {}

    Child (const Child &) = delete;
};

class Parent
{
public:
    Parent () : children {{5}, {7}} {}

private:
    Child children[2];
};
Run Code Online (Sandbox Code Playgroud)

此代码与Clang 3.5.0编译良好,但GCC 4.9.1抱怨我正在尝试使用已删除的复制构造函数:

test.cc: In constructor ‘Parent::Parent()’:
test.cc:13:35: error: use of deleted function ‘Child::Child(const Child&)’
     Parent () : children {{5}, {7}} {}
                                   ^
test.cc:7:5: note: declared here
     Child (const Child &) = delete;
     ^
Run Code Online (Sandbox Code Playgroud)

我已经读过复制初始化和直接初始化之间的区别(例如这里 …

c++ arrays gcc clang c++11

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

C++实例初始化语法

鉴于这样的类:

class Foo {
public:
    Foo(int);

    Foo(const Foo&);

    Foo& operator=(int);

private:
    // ...
};
Run Code Online (Sandbox Code Playgroud)

这两条线是完全相同的,还是它们之间有细微差别?

Foo f(42);

Foo f = 42;
Run Code Online (Sandbox Code Playgroud)

编辑:通过在原始问题中使Foo构造函数"显式",我感到困惑.我删除了,但欣赏答案.

我还添加了一个复制构造函数的声明,以明确复制可能不是一个简单的操作.

我真正想知道的是,根据C++标准,"Foo f = 42"会直接调用Foo(int)构造函数,还是会调用复制构造函数?

看起来fasih.ahmed有我正在寻找的答案(除非它是错的).

c++ initialization

11
推荐指数
2
解决办法
9259
查看次数

初始化..哪一个更有效?

我有以下问题.应该遵循哪一个更好,为什么?

string strMyString = "SampleString";
Run Code Online (Sandbox Code Playgroud)

要么

string strMyString("SampleString");
Run Code Online (Sandbox Code Playgroud)

提前致谢.

c++ constructor initialization

10
推荐指数
2
解决办法
3417
查看次数

积分或枚举类型的T t {x}和T t = {x}之间的差异?

在C++ 14中:

对于任何整数或枚举类型T以及任何表达式expr:

之间有什么区别:

struct S { T t { expr }; };
Run Code Online (Sandbox Code Playgroud)

struct S { T t = { expr }; };
Run Code Online (Sandbox Code Playgroud)

更新:

我得到了[dcl.init.list]p3b5:

如果初始化列表具有E类型的单个元素且T不是引用类型或其引用类型与E引用相关,则从该元素初始化对象或引用.

我相信这个引用适用于直接列表初始化复制列表初始化.

所以我认为答案是否定的,没有区别.

c++ initialization language-lawyer c++14

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

没有默认构造函数的奇怪的c ++拷贝构造函数

我和我的一位同事讨论过关于他人的问题

Pt pt;
Run Code Online (Sandbox Code Playgroud)

Pt pt = Pt(); 
Run Code Online (Sandbox Code Playgroud)

是等价的.我怀疑在第二种情况下可以调用复制分配,但事实证明并非如此.

当我们进行我们的小实验时,我决定测试一个奇怪的位,我的同事认为甚至不会编译:

//here the compiler calls a copy constructor and doesn't call the default constructor prior to that
// O_o
Pt pt = pt;
Run Code Online (Sandbox Code Playgroud)

以下是一个工作示例:http://ideone.com/XmJSz7

所以,问题是 - 发生了什么:

Pt pt = pt;
Run Code Online (Sandbox Code Playgroud)

c++ copy-constructor default-constructor

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

复制初始化的奇怪行为,不会调用copy-constructor!

我正在阅读直接初始化和复制初始化(§8.5/ 12)之间的区别:

T x(a);  //direct-initialization
T y = a; //copy-initialization
Run Code Online (Sandbox Code Playgroud)

我从阅读有关复制初始化的内容中了解到,它需要可访问和非显式的复制构造函数,否则程序将无法编译.我通过编写以下代码验证了它:

struct A
{
   int i;
       A(int i) : i(i) { std::cout << " A(int i)" << std::endl; }
   private:
       A(const A &a)  {  std::cout << " A(const A &)" << std::endl; }
};

int main() {
        A a = 10; //error - copy-ctor is private!
}
Run Code Online (Sandbox Code Playgroud)

GCC给出了一个错误(ideone)说:

prog.cpp:8:错误:'A :: A(const A&)'是私有的

到目前为止,一切都很好,重申Herb Sutter所说的,

复制初始化意味着在必要时首次调用用户定义的转换后,使用复制构造函数初始化对象,并且等效于"T t = u;"形式:


之后,我通过评论private …

c++ initialization copy-constructor copy-initialization

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

在C++中初始化变量的偏好

从c ++开始,注意到你可以用两种方式初始化变量

int example_var = 3;  // with the assignment operator '='
Run Code Online (Sandbox Code Playgroud)

要么

int example_var(3);  // enclosing the value with parentheses 
Run Code Online (Sandbox Code Playgroud)

是否有理由使用一个而不是另一个?

c++ variable-assignment copy-constructor assignment-operator

7
推荐指数
2
解决办法
283
查看次数

这不是复制初始化,不是吗?

在下面的代码中,我不允许声明一个显式的 ctor,因为编译器说我在复制初始化上下文中使用它(clang 3.3和gcc 4.8).我试图通过使ctor非显式,然后将复制构造函数声明为已删除来证明编译器是错误的.

编译器是错误还是有其他解释?

#include <iostream>

template <typename T>
struct xyz
{
    constexpr xyz (xyz const &)    = delete;
    constexpr xyz (xyz &&)         = delete;
    xyz & operator = (xyz const &) = delete;
    xyz & operator = (xyz &&)      = delete;
    T i;
    /*explicit*/ constexpr xyz (T i): i(i) { }
};

template <typename T>
xyz<T> make_xyz (T && i)
{
    return {std::forward<T>(i)};
}

int main ()
{
    //auto && x = make_xyz(7);
    auto && …
Run Code Online (Sandbox Code Playgroud)

c++ explicit-constructor copy-initialization c++11

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