noexcept如果您的实现具有零成本(如果没有抛出)异常模型,说明符是否无用?什么是缺乏noexcept有后果的例子?
什么时候应该将noexcept属性添加到函数中?即编译器什么时候无法判断函数抛出异常?所有的东西都应该被标记吗?或者有什么方法可以区分吗?
我不喜欢过早优化,也不喜欢过早归因。我不知道有什么方法可以像noexcept优化时分析性能一样“分析”需求。
在评估必要时,请评论最常见的编译器,例如 MSVC、GCC 等。
该[[nodiscard]]属性对于操作员来说是必需的吗?或者可以安全地假设编译器会发出警告,就像它对大多数可疑丢弃的东西所做的那样?
例如,一个重载的operator+,应该应用该属性吗?函数转换运算符或新运算符等特殊运算符又如何呢?什么时候迂腐了?
是否有一个标准类型来取消类型标记?它可能会这样实现:
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 风格转换而支持函数风格转换?
如何防止简单的宏替换?
例如
#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)
我目前的方法是推送宏值,取消定义,使用它,然后弹出原始值。
我似乎无法在商店之后获得原子对象的地址。
例如
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?这是一个有目的的设计选择还是一个疏忽?
更具体地说,这个要求的幕后发生了什么?
有std::stoull哪个需要一个basic_string_view?我不想构造一个字符串只是为了调用std::stoull,特别是因为它由const &.
如果不存在,什么是一个转变的有效途径std::basic_string_view来unsigned long long?