当使用包含多个大括号内列表的大括号列表时,B、C和D的标准定义了哪些规则?
对于B,我相信这个场景在标准中被定义为一个带有单个元素的大括号-init-列表,因此它直接调用Test(int)而没有临时的--但是我找不到位置。
对于C和D,我不确定这是否是未定义的行为。
我还感兴趣的是,当使用多个元素(即{{{1, 2}}} )时会发生什么,以及这是否会改变B、C或D的行为?
#include <iostream>
struct Test {
Test(const int a) {
// A and B call this
}
Test(Te
因此,我正在浏览这篇描述std::pair代码的讲义。以下是代码:
template <class U, class V>
struct pair {
U first;
V second;
pair(const U& first = U(), const V& second = V()) :
first(first), second(second) {}
};
template <class U, class Y>
pair<U, V> make_pair(const U& first, con
我昨天才知道,为初始化器列表项指定参数是可选的。然而,在这种情况下发生的规则是什么?
在下面的示例中,ptr是否会被初始化为0,切换为false,以及Bar default-constructed?我猜这个问题有点多余,因为如果未指定的参数值为==未定义的行为,则初始化器列表中几乎没有意义。
我是否还可以参考C++标准中的一节,该节规定了初始化器列表项未被赋予参数的情况下的行为?
class Bar
{
Bar() { }
};
class SomeClass;
class AnotherClass
{
public:
SomeClass *ptr;
bool tog
在C++14中:
对于任何整数或枚举类型T和任何表达式expr
在以下几个方面之间是否有区别:
struct S { T t { expr }; };
和
struct S { T t = { expr }; };
更新:
我去了[dcl.init.list]p3b5,上面写着:
如果初始化程序列表有一个类型E的元素,并且T不是引用类型,或者其引用类型与E相关,则从该元素初始化对象或引用。
我相信这句话适用于直接列表初始化和复制列表初始化.
所以我认为答案是否定的,没有区别。
我想用这样的初始化列表初始化一个结构:
struct S
{
int a;
int b;
// S() : a(0), b(0){} // uncommenting will cause compile error:
// error C2440: 'initializing' : cannot convert from 'initializer-list' to 'S'
// S(int aArg, int bArg) : a(aArg), b(bAr
在C++11之前,我们可以通过编写类似于A a = 1;的东西来进行复制初始化,它或多或少相当于A a = A(1);。也就是说,首先创建一个临时的,然后调用一个复制ctor。无论复制省略,这必须是这样的概念和复制ctor必须是可访问的。
使用C++11中的列表初始化,我们可以通过编写A a = {1, 2};来进行复制列表初始化。在我看来,这应该或多或少地等同于A a = A(1, 2);。然而,在GCC和clang上,即使复制和移动ctor无法访问(声明为私有),A a = {1, 2}也会进行编译。不过,如果无法访问相应的复制/移动ctor,则A a = 1;不会在GCC或clang上编
我已经试着学了大约一个月的C++,它仍然困扰着我。例如,这段“容易”的代码:
class A
{
int m;
public:
A() = default;
int getM() { return m; }
};
class B
{
int m;
public:
// empty body and empty initializer list
B() {} // isn't this the same as "B() = default;" ?
int getM() { return m; }
};
int
#include <iostream>
#include <string>
#include <typeinfo>
#include <typeindex>
#include <map>
#include <vector>
class Base{
public:
virtual ~Base() {}
};
class Derived: public Base { };
int main(){
int arr[10];
Derived d;
Base *p = &d;
这是关于在C++中使用构造函数的一个非常琐碎的问题。我将以面试对话的形式呈现(很难以任何其他形式呈现)。
面试官-什么是构造函数?
me -构造函数是一种特殊的函数,它确保所有对象在使用前都被初始化。
面试官-什么是初始化程序列表?
me -,它是所有初始化发生的列表。只有在初始化所有数据成员或调用所有成员对象的某些构造函数之后,才会输入构造函数的主体。
面试官-,这意味着初始化是在初始化程序列表中进行的,而不是在构造函数中执行的.但是您说过构造函数初始化对象!你不是吗?你想回答我的第一个问题吗。
me -我认为构造函数是赋值的,它对已经初始化的成员对象调用赋值操作符。
所以我对你的问题是
初
我正在阅读有关初始化的内容,它讨论了不同类型的初始化,演示了其中a是一个任意变量(每个变量具有不同的语法):
默认初始化T
值初始化T{}
直接初始化T(a)
复制初始化T val = a
列表初始化T{...}
聚合初始化T{...}
参考初始化T &ref = a
零初始化T{}
常数初始化static T &ref = a
复制构造函数可以通过复制初始化来使用,但是复制初始化与复制构造函数不一样。(对吧?)这使我想知道以下几点:
某些类型的初始化语法重叠,例如值初始化和零初始化都使用相似的语法,聚合初始化和列表初始化具有相似的语
这段代码用GCC 5.X,MSVC编译得很好,但是GCC 6.X给出了错误:
“从初始化程序列表转换到'a‘将使用显式构造函数’a:a()‘”,“选择的构造函数在复制初始化中是显式的”。
删除explicit或更改为a c{}解决了这个问题,但我很好奇为什么它会这样工作。
class a
{
public:
explicit a () {}
};
struct b
{
a c;
};
int main() {
b d{};
}
我想用计数和值初始化std::vector<char>。
这样做是可行的:
int n = 100;
std::vector<char> v(n, 0);
但是,列表初始化std::vector<char> v{n, char(0)};提供了以下内容:
warning: narrowing conversion of ‘n’ from ‘int’ to ‘char’.
是否有方法使用列表初始化语法,但避免调用initializer_list构造函数?
我试图理解@bolov对 1问题的第一个被接受的答案。
似乎我在那里发现了一个错误,所以它把整个解释搞砸了。
@bolov解释了为什么这段代码成功地在c++11中编译:
场景A
struct foo {
foo() = delete;
};
// All bellow OK (no errors, no warnings)
foo f = foo{};
foo f = {};
foo f{}; // will use only this from now on.
以及为什么这段代码无法在c++11中编译:
场景C
struct foo {
foo() = delete;
foo(
正如预期的那样,以下内容没有编译:
class A {
public:
A() = default;
//A(A&&) = default;
A(const A&) = delete;
int x;
};
int main()
{
auto a4 = A{}; // not ok, copy constructor is deleted
auto a5 = A(); // not ok, copy constructor is deleted
return 0;
}
但是,如果添加了一个移动构造函数,即使已显式删