在 C 和 C++ 语言中,编译器如何区分*何时用作指针 ( MyClass* class)、何时用作乘法运算符 ( a * b) 或何时用作解引用运算符 ( *my_var)?
由于finally在C++中没有,你必须使用RAII设计模式,如果你希望你的代码是异常安全的.一种方法是使用像这样的本地类的析构函数:
void foo() {
struct Finally {
~Finally() { /* cleanup code */ }
} finalizer();
// ...code that might throw an exception...
}
Run Code Online (Sandbox Code Playgroud)
与直接解决方案相比,这是一个很大的优势,因为您不必编写清理代码2次:
try {
// ...code that might throw an exception...
// cleanup code (no exception)
} catch (...) {
// cleanup code (exception)
throw;
}
Run Code Online (Sandbox Code Playgroud)
本地类解决方案的一大缺点是您无法直接访问清理代码中的局部变量.因此,如果您需要访问它们,它会使您的代码膨胀很多,无论如何:
void foo() {
Task* task;
while (task = nextTask()) {
task->status = running;
struct Finally {
Task* task;
Finally(Task* task) : task(task) {}
~Finally() { task->status …Run Code Online (Sandbox Code Playgroud) 在过去一年左右的时间里,我注意到 StackOverflow 上有一些与 C++ 相关的答案mdspan,但我从未在 C++ 代码中真正看到过这些答案。我尝试在 C++ 编译器的标准库目录和C++ 编码指南中查找它们- 但找不到它们。我确实找到了std::span;我猜它们是相关的——但是如何呢?添加“md”代表什么?
请解释一下这个神秘实体的用途,以及我何时需要使用它。
When using placement new in generic code to construct an object at a specified address, the usage pattern is a bit different from usual code. For example, consider this implementation of uninitialized_copy: ([uninitialized.copy])
template <class It, class For>
For uninitialized_copy(It first, It last, For dest)
{
using T = typename std::iterator_traits<For>::value_type;
for (; first != last; ++first, (void)++dest)
::new (static_cast<void*>(std::addressof(*dest))) T(*first);
}
Run Code Online (Sandbox Code Playgroud)
This post addresses the following points from the perspective of the standard:
why ::new is …
c++ c++-faq generic-programming placement-new language-lawyer
假设我要制作一个新的演绎指南,以便进行以下操作?
std::string str;
std::basic_string_view sv = str;
Run Code Online (Sandbox Code Playgroud)
Would that be an Ok customization ?
c++ c++-faq language-lawyer deduction-guide class-template-argument-deduction
我发现必须修复链接时发生的 C++ 错误(尤其是未定义的引用错误)非常令人沮丧,因为所有函数名称都被破坏了。错误名称的示例:
_ZNK5boost7archive6detail11oserializerINS0_13text_oarchiveEN9galandria8UniverseEE16save_object_dataERNS1_14basic_oarchiveEPKv
Run Code Online (Sandbox Code Playgroud)
读起来太难了,找到真正的功能就更难了。
有没有办法说服ld输出损坏的名称?
这是我经常遇到的问题.以下示例说明了它:
struct A {
int m_SomeNumber;
};
struct B {
B( A & RequiredObject );
private:
A & m_RequiredObject;
};
struct C {
C( );
private:
A m_ObjectA;
B m_ObjectB;
};
Run Code Online (Sandbox Code Playgroud)
C看起来像这样的构造函数的实现:
C::C( )
: B( m_ObjectA )
{ }
Run Code Online (Sandbox Code Playgroud)
由于未定义初始化顺序,因此在调用m_ObjectA构造函数时可能未初始化m_ObjectB,从而导致未定义的行为.强制某个初始化顺序的一种方法是使成员指针并在构造函数体中初始化它们,从而强制正确的顺序,但由于几个原因这很难看.有没有办法使用构造函数的初始化列表强制某个初始化顺序?如果没有,你有任何其他建议如何处理这个.
我正在寻找一种语法来从辅助存储设备而不是从默认堆分配内存.
我该如何实现它?malloc()默认情况下使用将它从堆中取出...当然必须有另一种方法!
有很多与 C++ 全局变量相关的问题和答案,例如:
它们都包含一些小信息片段,例如inline变量在 C++17 中具体如何工作等。其中一些还没有很好地老化,因为 C++17 通过引入inline变量从根本上改变了规则。
C++20 还引入了模块和模块链接,这再次使得 StackOverflow 上的大多数内容过时,甚至过时。
本问答旨在统一这些问题,并为读者提供考虑这些版本更改的概述。
static、inline、extern、const等constexpr作为全局变量?C++ 中运算符的优先级和结合性是什么?
谁定义了运算符优先级和结合性,以及它与求值顺序有何关系?解释了这些属性如何从语法中出现。然而,我只是对所有规则的列表感兴趣。
这个问题应该是一个社区常见问题解答,可以参考而不是cppreference 文章。
c++ ×12
c++-faq ×12
c ×1
class-template-argument-deduction ×1
constants ×1
constructor ×1
destructor ×1
exception ×1
finally ×1
grammar ×1
lexer ×1
linkage ×1
mdspan ×1
raii ×1
std-span ×1