在下面的代码中,我使用[[fallthrough]]
C++ 1z中的标准属性来记录需要的漏洞:
#include <iostream>
int main() {
switch (0) {
case 0:
std::cout << "a\n";
[[fallthrough]]
case 1:
std::cout << "b\n";
break;
}
}
Run Code Online (Sandbox Code Playgroud)
使用GCC 7.1,代码编译时没有错误.但是,编译器仍然警告我一个问题:
warning: this statement may fall through [-Wimplicit-fallthrough=]
std::cout << "a\n";
~~~~~~~~~~^~~~~~~~
Run Code Online (Sandbox Code Playgroud)
为什么?
请考虑以下示例:
#include <cstdlib>
int main() {
const int m = 42;
[] { m; }(); // OK
const int n = std::rand();
[] { n; }(); // error: 'n' is not captured
}
Run Code Online (Sandbox Code Playgroud)
为什么我需要捕获n
第二个lambda而不是m
第一个lambda?我在C++ 14标准中检查了第5.1.2节(Lambda表达式)但我无法找到原因.你能指点我解释一个段落吗?
更新:我在GCC 6.3.1和7(主干)中观察到了这种行为.Clang 4.0和5(主干)在两种情况下都失败并出错(variable 'm' cannot be implicitly captured in a lambda with no capture-default specified
).
从C++ 1z开始,我们可以std::string_view
轻松地查看连续的字符序列,避免不必要的数据复制.const std::string&
现在经常建议使用,而不是使用参数std::string_view
.
但是,很快就会发现切换const std::string&
到std::string_view
使用字符串连接的中断代码,因为不支持连接std::string
和std::string_view
:
std::string{"abc"} + std::string_view{"def"}; // ill-formed (fails to compile)
std::string_view{"abc"} + std::string{"def"}; // ill-formed (fails to compile)
Run Code Online (Sandbox Code Playgroud)
为什么不支持连接std::string
和std::string_view
标准?
以下命令
$ cargo build
Run Code Online (Sandbox Code Playgroud)
生成带有调试信息的非优化构建.反之,
$ cargo build --release
Run Code Online (Sandbox Code Playgroud)
生成优化的构建,无需调试信息.
有没有办法用调试信息生成优化的构建?我需要这个来获得有意义的分析信息.
在C++中,您可以将许多内容声明为constexpr
:变量,函数(包括成员函数和运算符),构造函数,以及自C++ 1z以来的if
语句和lambda表达式.但是,声明析构函数会 constexpr
导致错误:
struct X {
constexpr ~X() = default; // error: a destructor cannot be 'constexpr'
};
Run Code Online (Sandbox Code Playgroud)
我的问题:
constexpr
?constexpr
吗?~X() = default;
),它会自动constexpr
吗?在C++ 17,std::map
并std::unordered_map
有一个新的成员函数模板:try_emplace()
.在n4279中提出的这一新增功能表现相似emplace()
,但具有以下优点:
try_emplace()
如果插入没有发生,则不会从rvalue参数移动.这在操作其值为仅移动类型的地图时非常有用,例如std::unique_ptr
.try_emplace()
分别处理密钥和参数mapped_type
,这使得它比以value_type
(即std::pair
)表示的通用变更器更直观.鉴于上述优点,在编写仅使用C++ 1z的代码时,您是否会使用emplace()
C++ 11而不是try_emplace()
C++ 1z?
在我的理解中,存在的唯一理由std::make_pair
,并std::make_tuple
是,你不必自己写的类型,它们会自动推导.在C++ 1z中,我们对类模板进行了模板参数推导,这使我们可以简单地编写
std::pair p(1, 2.5); // C++1z
Run Code Online (Sandbox Code Playgroud)
代替
auto p = std::make_pair(1, 2.5); // C++11/14
Run Code Online (Sandbox Code Playgroud)
情况std::tuple
类似.这导致以下问题:在C++ 1Z,有一种情况,其有利于使用std::make_pair
和std::make_tuple
替代使用的构造std::pair
和std::tuple
?
请考虑纯C++ 1z代码(即不需要向后兼容C++ 14)并假设每个人都熟悉这个C++ 1z特性.
有没有一种情况时decltype(auto)
会比一个更好的选择auto
(可能与&
,&&
或CV限定符)时,使用基于范围的for循环?换句话说,你会写下面的代码吗?
for (decltype(auto) item : range) {
// ...
}
Run Code Online (Sandbox Code Playgroud) 考虑以下C++代码:
#include <string>
struct A {
A(const std::string& s): s(s) {}
std::string s;
};
struct B: A {
using A::A;
};
int main() {
B b("test");
}
Run Code Online (Sandbox Code Playgroud)
当我使用-Wuseless-cast
参数通过GCC 6.2.1编译它时
g++ -std=c++14 -Wuseless-cast test.cpp -o test
Run Code Online (Sandbox Code Playgroud)
它会发出以下警告:
test.cpp: In constructor ‘B::B(const string&)’:
test.cpp:9:14: warning: useless cast to type ‘const string& {aka const std::__cxx11::basic_string<char>&}’ [-Wuseless-cast]
using A::A;
^
test.cpp: In function ‘int main()’:
test.cpp:13:15: note: synthesized method ‘B::B(const string&)’ first required here
B b("test");
^
Run Code Online (Sandbox Code Playgroud)
但是,当我改变定义B
为
struct B: …
Run Code Online (Sandbox Code Playgroud) 请考虑以下使用C++ 17结构化绑定的代码:
int a = 0, b = 0;
auto [x, y] = std::tie(a, b);
y = 1;
std::cout << a << ' ' << b << '\n';
Run Code Online (Sandbox Code Playgroud)
由于我使用auto
,我希望的代码打印0 0
的y
应该是一个拷贝.然而,它打印0 1
.为什么?我认为裸露auto
从不推断参考.
c++ ×9
c++17 ×5
auto ×1
c++14 ×1
const ×1
constexpr ×1
decltype ×1
fall-through ×1
for-loop ×1
gcc ×1
lambda ×1
rust ×1
rust-cargo ×1
string ×1
string-view ×1