在对不可复制变量(例如std::atomic<int>)执行成员初始化时,需要使用direct-initialization而不是copy-initialization根据此处的答案。然而,当我打开-std=c++17的g++ 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。这里哪一个是正确的?
简单问题:以下陈述是否相同?或者是第二个在幕后做更隐含的事情(如果是这样的话,是什么?)
myClass x(3);
myClass x = myClass(3);
Run Code Online (Sandbox Code Playgroud)
谢谢!
关于为什么我不能初始化对象数组(如果它们有私有拷贝构造函数)的现有问题?特指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)
我已经读过复制初始化和直接初始化之间的区别(例如这里 …
鉴于这样的类:
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有我正在寻找的答案(除非它是错的).
我有以下问题.应该遵循哪一个更好,为什么?
string strMyString = "SampleString";
Run Code Online (Sandbox Code Playgroud)
要么
string strMyString("SampleString");
Run Code Online (Sandbox Code Playgroud)
提前致谢.
在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引用相关,则从该元素初始化对象或引用.
我相信这个引用适用于直接列表初始化和复制列表初始化.
所以我认为答案是否定的,没有区别.
我和我的一位同事讨论过关于他人的问题
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) 我正在阅读直接初始化和复制初始化(§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 ++开始,注意到你可以用两种方式初始化变量
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
在下面的代码中,我不允许声明一个显式的 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)