这个系列是从这篇博客开始的,主要是复现Jason Turner的“C++ Weekly With Jason Turner”视频中的代码。
025 aggregate initialization
必须要C++17或之后。基本思想是初始化派生类,但是行为和structured binding好像,就是当出现私有成员时,就不行了。使用类型不正确的初始值也是不行的,但是可以忽略定义次序上排在后面的公有成员变量。即使忽略私有成员,也无法初始化。
class A {
public:
int a = 0;
};
struct SA {
int a = 0;
void f() {}
};
class B : public A {
public:
int b = 0;
};
class C {
public:
int a = 0;
int b = 0;
};
class D {
public:
int a = 0;
private:
int b = 0;
};
struct SD {
int a = 0;
private:
int b = 0;
};
int main() {
A a {1};
// A af {1.1}; // This is an error.
SA sa {1};
B b { {1}, 2 };
C c { 1, 2 };
C cc {1};
// The followings will cause errors.
// D d { 1, 2 };
// SD sd { 1, 2 };
// D d {1};
// SD sd {1};
return 0;
}
029-030 Attribute
Jason在这两期介绍了两个attribute,挺有意思。一个是用于取消编译器对特定的、未使用的变量的warning,[[maybe_unused]]
。一个是强制编译器以warning形式提示函数的返回值不应该被忽略,[[nodiscard]]
。但是在我目前的gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0上,使用 -Wall时报出的warning并不包含未使用的函数参数。
编译下述代码时g++的warning输出在代码下方。
[[nodiscard]]
int func(){
return 1;
}
int func(int a, [[maybe_unused]] int b, int c) {
int d;
return ++a;
}
int main( int argc, char** argv ) {
int a;
[[maybe_unused]] int b;
func();
return func(argc, 1, 2);
}
main.cpp: In function ‘int func(int, int, int)’:
main.cpp:8:9: warning: unused variable ‘d’ [-Wunused-variable]
8 | int d;
| ^
main.cpp: In function ‘int main(int, char**)’:
main.cpp:15:9: warning: ignoring return value of ‘int func()’, declared with attribute nodiscard [-Wunused-result]
15 | func();
| ~~~~^~
main.cpp:3:5: note: declared here
3 | int func(){
| ^~~~
main.cpp:13:9: warning: unused variable ‘a’ [-Wunused-variable]
13 | int a;
|