小编s3r*_*vac的帖子

为什么即使我使用[[fallthrough]],GCC也会警告我一个漏洞?

在下面的代码中,我使用[[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)

为什么?

c++ switch-statement fall-through c++17

82
推荐指数
1
解决办法
1万
查看次数

为什么有时不需要在lambda中捕获const变量?

请考虑以下示例:

#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++ lambda const language-lawyer

70
推荐指数
2
解决办法
4898
查看次数

为什么不支持连接std :: string和std :: string_view?

从C++ 1z开始,我们可以std::string_view轻松地查看连续的字符序列,避免不必要的数据复制.const std::string&现在经常建议使用,而不是使用参数std::string_view.

但是,很快就会发现切换const std::string&std::string_view使用字符串连接的中断代码,因为不支持连接std::stringstd::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::stringstd::string_view标准?

c++ string string-view c++17

47
推荐指数
2
解决办法
4035
查看次数

使用货物时如何使用调试信息获取发布版本?

以下命令

$ cargo build
Run Code Online (Sandbox Code Playgroud)

生成带有调试信息的非优化构建.反之,

$ cargo build --release
Run Code Online (Sandbox Code Playgroud)

生成优化的构建,无需调试信息.

有没有办法调试信息生成优化的构建?我需要这个来获得有意义的分析信息.

rust rust-cargo

34
推荐指数
2
解决办法
1万
查看次数

为什么不能将析构函数标记为constexpr?

在C++中,您可以将许多内容声明为constexpr:变量,函数(包括成员函数和运算符),构造函数,以及自C++ 1z以来的if语句lambda表达式.但是,声明析构函数会 constexpr导致错误:

struct X {
    constexpr ~X() = default; // error: a destructor cannot be 'constexpr'
};
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 为什么不能标记析构函数constexpr
  2. 如果我不提供析构函数,是隐式生成的析构函数constexpr吗?
  3. 如果我声明一个默认的析构函数(~X() = default;),它会自动constexpr吗?

c++ language-lawyer constexpr

33
推荐指数
3
解决办法
3087
查看次数

有没有理由在C++ 1z中使用std :: map :: emplace()而不是try_emplace()?

在C++ 17,std::mapstd::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?

c++ c++17

31
推荐指数
3
解决办法
5333
查看次数

在C++ 1z中std :: make_pair和std :: make_tuple的用处

在我的理解中,存在的唯一理由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_pairstd::make_tuple替代使用的构造std::pairstd::tuple

请考虑纯C++ 1z代码(即不需要向后兼容C++ 14)并假设每个人都熟悉这个C++ 1z特性.

c++ c++17

20
推荐指数
1
解决办法
2170
查看次数

基于范围的for循环与decltype(自动)

有没有一种情况时decltype(auto)会比一个更好的选择auto(可能与&,&&或CV限定符)时,使用基于范围的for循环?换句话说,你会写下面的代码吗?

for (decltype(auto) item : range) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

c++ for-loop decltype auto c++14

15
推荐指数
1
解决办法
832
查看次数

为什么GCC在使用继承的构造函数时会警告我无用的转换?

考虑以下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++ gcc

14
推荐指数
1
解决办法
941
查看次数

为什么auto在使用结构化绑定时似乎会推断出引用?

请考虑以下使用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 0y应该是一个拷贝.然而,它打印0 1.为什么?我认为裸露auto从不推断参考.

c++ c++17 structured-bindings

12
推荐指数
1
解决办法
587
查看次数