小编j5w*_*j5w的帖子

不扔是零成本的时候,noexcept 是不是没用?

noexcept如果您的实现具有零成本(如果没有抛出)异常模型,说明符是否无用?什么是缺乏noexcept有后果的例子?

c++ compilation exception noexcept

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

什么时候应该显式地赋予 noexcept 属性?

什么时候应该将noexcept属性添加到函数中?即编译器什么时候无法判断函数抛出异常?所有的东西都应该被标记吗?或者有什么方法可以区分吗?

我不喜欢过早优化,也不喜欢过早归因。我不知道有什么方法可以像noexcept优化时分析性能一样“分析”需求。

在评估必要时,请评论最常见的编译器,例如 MSVC、GCC 等。

c++ gcc clang visual-c++

8
推荐指数
1
解决办法
2390
查看次数

运营商是否需要nodiscard?

[[nodiscard]]属性对于操作员来说是必需的吗?或者可以安全地假设编译器会发出警告,就像它对大多数可疑丢弃的东西所做的那样?

例如,一个重载的operator+,应该应用该属性吗?函数转换运算符或新运算符等特殊运算符又如何呢?什么时候迂腐了?

c++ c++17 nodiscard

7
推荐指数
1
解决办法
3691
查看次数

是否有标准的 Untokenize 模板类型?

是否有一个标准类型来取消类型标记?它可能会这样实现:

template<class T>
using untokenize = T;
Run Code Online (Sandbox Code Playgroud)

这样我可以使用重载运算符执行以下转换:

struct x {
  int y;
  operator int&() {
    return y;
  }
};

x a;
// int&(a); // doesn't work
// (int&)(a); // not the same thing
untokenize<int&>(a); // works great
Run Code Online (Sandbox Code Playgroud)

或者是否有另一种更标准的方法来实现我的目标,即避免使用 c 风格转换而支持函数风格转换?

c++ c++17

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

防止简单的宏替换

如何防止简单的宏替换?

例如

#define number 0x10

int number = 0x5;
Run Code Online (Sandbox Code Playgroud)

我知道这可以通过用括号将宏括起来(因此,将它与用于 args 的相邻括号分开)来为函数样式的宏完成,例如minand max

#define max(...)

void (max)();
Run Code Online (Sandbox Code Playgroud)

我目前的方法是推送宏值,取消定义,使用它,然后弹出原始值。

c c++

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

存储后的 std::atomic 地址

我似乎无法在商店之后获得原子对象的地址。

例如

std::atomic<int> i;
std::atomic<int>* p = &++i; // doesn't work
auto* p = &++i; // doesn't work
// below works:
++i;
auto* p = &i;
Run Code Online (Sandbox Code Playgroud)

这里发生了什么,为什么?

澄清一下:我知道它返回一个 r 值。为什么它不返回原始对象,this?这是一个有目的的设计选择还是一个疏忽?

更具体地说,这个要求的幕后发生了什么?

c++ operator-overloading language-lawyer stdatomic c++17

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

std::stoull 但带有 string_view

std::stoull哪个需要一个basic_string_view?我不想构造一个字符串只是为了调用std::stoull,特别是因为它由const &.

如果不存在,什么是一个转变的有效途径std::basic_string_viewunsigned long long

c++ c++17

0
推荐指数
1
解决办法
323
查看次数