我用GCC编译了一些代码-Wall并-Wextra启用了.此代码生成警告:
struct A { A(int) {} };
struct B {};
struct C : A, B {};
int main() {
(void) C{1};
}
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)main.cpp: In function 'int main()': main.cpp:11:15: warning: missing initializer for member 'C::<anonymous>' [-Wmissing-field-initializers] (void) C{1}; ^
我应该担心吗?这是GCC输出此警告的错误吗?似乎我没有要初始化的字段,也没有缺少参数.
遇到了一个非常见的c ++初始化代码,似乎可以正常使用以下代码...
struct sfoobar { char bar[10]; char foo[10]; };
...
sfoobar x { 0 };
Run Code Online (Sandbox Code Playgroud)
这是将这些char数组初始化为零的可接受方法吗?
有一个包含POD的结构,默认构造函数已删除。尝试对struct实例进行汇总初始化时,使用编译时会在g ++ 9.1中导致编译错误-std=c++2a。相同的代码可以使用编译-std=c++17。
struct S
{
int a;
S() = delete;
};
int main()
{
S s {.a = 0};
}
Run Code Online (Sandbox Code Playgroud) P1008(“使用用户声明的构造函数禁止聚合”)已成为C ++ 20标准的一部分,以防止在使用聚合初始化时出现意外行为:
struct X {
int i{42};
X() = delete;
};
int main() {
X x2{3}; // Compiles in C++17, error in C++20
}
Run Code Online (Sandbox Code Playgroud)
我同意X x2{3};不应该汇编以上声明。然而,证明P1008是我遇到的所有例子都并不现实-他们是纯粹的语法和基本无意义foo/ bar/ baz代码片段。
P1008 在实际中解决什么问题?我很难想象我最终将如何X在一个真实的程序中编写类似上面的内容。
在C ++ 17聚合中删除默认构造函数而不提供其他构造函数进行初始化对我来说似乎不现实。
以下代码返回下面的编译错误。我一直无法理解为什么初始化程序太多。该代码使用vector<X>. 有谁知道为什么会报告错误以及如何解决?谢谢
#include <iostream>\n#include <array>\nusing namespace std;\n\nstruct X {\n int x, y;\n};\n\nint main(int argc, char *argv[])\n{\n array<X,2> a0 = {{0,1}, {2,3}};\n\n for (auto& p : a0) {\n cout << p.x << endl;\n cout << p.y << endl;\n }\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n汇编:
\n\ng++ -pedantic -Wall test116.cc && ./a.out\ntest116.cc: In function \xe2\x80\x98int main(int, char**)\xe2\x80\x99:\ntest116.cc:11:34: error: too many initializers for \xe2\x80\x98std::array<X, 2>\xe2\x80\x99\n array<X,2> a0 = {{0,1}, {2,3}};\nRun Code Online (Sandbox Code Playgroud)\n 我在这里面临着一个相对棘手的情况,乍一看似乎很容易。将这三个成员从父类移动Parent到其子类后Child,我似乎不再能够利用默认构造函数。
为什么?有没有办法无需专门实现 Child(...) 构造函数。乍一看似乎违反直觉......实际上我认为第一个示例是它失败的地方(认为子类的构造函数会掩盖其父类的构造函数)。
struct Parent
{
std::string mText;
int mInt;
bool mBool;
};
struct Child : public Parent
{
};
Child test{ "", 0, false}; // Compiles
Run Code Online (Sandbox Code Playgroud)
但在后一种情况下,如果在子类中定义了成员,则不会创建默认构造函数。
struct Parent
{
};
struct Child : public Parent
{
std::string mText;
int mInt;
bool mBool;
};
Child test{ "", 0, false}; // error C2078: too many initializers
Run Code Online (Sandbox Code Playgroud) c++ inheritance initialization initializer-list aggregate-initialization
在以下程序中:
#include <iostream>
struct I {
int i;
I(){i=2;}
I(int _i){i=_i;}
};
int a[3] = {a[2] = 1};
int aa[3][3] = {aa[2][2] = 1};
I A[3] = {A[2].i = 1};
I AA[3][3] = {AA[2][2].i = 1};
int main(int argc, char **argv) {
for (int b : a) std::cout << b << ' ';
std::cout << '\n';
for (auto &bb : aa) for (auto &b : bb) std::cout << b << ' ';
std::cout << '\n';
for (auto &B : A) …Run Code Online (Sandbox Code Playgroud) 我正在使用 RAD studio 10.2 附带的 clang 编译器(我认为是 c++ 11)。我今天错误地发现结构或数组的前 n 个成员可以使用通常的大括号进行分配,例如
int a[500]={1};
struct {int a,b,c;} st={2,3};
Run Code Online (Sandbox Code Playgroud)
上面的编译和工作正常,但我从来没有遇到过这个或见过它以前使用过,我在网上找不到它的提及(也许我正在使用错误类型的措辞进行搜索)。这个 C++ 有文档吗?
在下面的程序中,联合U有两个字段a和b,每个字段都有不同的默认值。如果U使用聚合初始化创建一个类型的变量,{}则联合的值和活动成员是什么?
#include <iostream>
struct A { int x = 1; };
struct B { int x = 0; };
union U {
A a;
B b;
};
int main() {
U u{};
std::cout << u.a.x;
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,编译器在这里有分歧:Clang 打印1和 GCC 打印0,演示:https : //gcc.godbolt.org/z/8Tj4Y1Pv1
其中一个编译器是否存在错误,或者此处的行为不是由标准定义的?
A<T>在下面的代码中,使用指定的初始化器以两种略有不同的形式使用模板参数推导来初始化对象:
template<typename T>
struct A { T t; };
int main() {
A a{.t=1}; //#1: ok in GCC and MSVC
A b{.t={1}}; //#2: ok in MSVC only
}
Run Code Online (Sandbox Code Playgroud)
第一种方式被 GCC 和 MSVC 接受,而第二种方式仅适用于 MSVC,但 GCC 会打印错误:
error: class template argument deduction failed:
error: no matching function for call to 'A(<brace-enclosed initializer list>)'
Run Code Online (Sandbox Code Playgroud)
演示: https: //gcc.godbolt.org/z/PaEaMjM7q
哪个编译器是正确的?
c++ templates language-lawyer aggregate-initialization c++20