标签: c++-faq

C/C++ 编译器如何区分 * 运算符(指针、解引用运算符、乘法运算符)的使用?

在 C 和 C++ 语言中,编译器如何区分*何时用作指针 ( MyClass* class)、何时用作乘法运算符 ( a * b) 或何时用作解引用运算符 ( *my_var)?

c c++ c++-faq lexical-analysis lexer

12
推荐指数
2
解决办法
601
查看次数

正确替换C++中缺少的'finally'

由于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)

c++ exception finally c++-faq

11
推荐指数
3
解决办法
6769
查看次数

什么是 mdspan,它的用途是什么?

在过去一年左右的时间里,我注意到 StackOverflow 上有一些与 C++ 相关的答案mdspan,但我从未在 C++ 代码中真正看到过这些答案。我尝试在 C++ 编译器的标准库目录和C++ 编码指南中查找它们- 但找不到它们。我确实找到了std::span;我猜它们是相关的——但是如何呢?添加“md”代表什么?

请解释一下这个神秘实体的用途,以及我何时需要使用它。

c++ c++-faq std-span mdspan

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

Using placement new in generic programming

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

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

C++析构函数的工作原理

可能重复:
C++ 析构函数中的对象销毁在C++中
检查

我想要一个简单的程序来看看析构函数在C++中是如何工作的?

我基本上不明白什么时候调用析构函数.

c++ destructor raii c++-faq

7
推荐指数
0
解决办法
389
查看次数

我可以在`std`名称空间中添加一个推导指南吗?

假设我要制作一个新的演绎指南,以便进行以下操作?

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

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

有没有一种“简单”的方法可以让 ld 输出解构函数名称?

我发现必须修复链接时发生的 C++ 错误(尤其是未定义的引用错误)非常令人沮丧,因为所有函数名称都被破坏了。错误名称的示例:

_ZNK5boost7archive6detail11oserializerINS0_13text_oarchiveEN9galandria8UniverseEE16save_object_dataERNS1_14basic_oarchiveEPKv
Run Code Online (Sandbox Code Playgroud)

读起来太难了,找到真正的功能就更难了。

有没有办法说服ld输出损坏的名称?

c++ c++-faq

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

默认函数参数的有效表达式

函数或成员函数中的默认参数的所有可能类型的有效表达式是什么?

c++ c++-faq

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

使用成员初始化成员

这是我经常遇到的问题.以下示例说明了它:

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,从而导致未定义的行为.强制某个初始化顺序的一种方法是使成员指针并在构造函数体中初始化它们,从而强制正确的顺序,但由于几个原因这很难看.有没有办法使用构造函数的初始化列表强制某个初始化顺序?如果没有,你有任何其他建议如何处理这个.

c++ constructor c++-faq ctor-initializer

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

如何重载"new"运算符以从辅助存储器设备分配内存?

我正在寻找一种语法来从辅助存储设备而不是从默认堆分配内存.

我该如何实现它?malloc()默认情况下使用将它从堆中取出...当然必须有另一种方法!

c++ memory-management c++-faq

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

全局变量 - 何时使用 static、inline、extern、const 和 constexpr

有很多与 C++ 全局变量相关的问题和答案,例如:

它们都包含一些小信息片段,例如inline变量在 C++17 中具体如何工作等。其中一些还没有很好地老化,因为 C++17 通过引入inline变量从根本上改变了规则。

C++20 还引入了模块和模块链接,这再次使得 StackOverflow 上的大多数内容过时,甚至过时。

本问答旨在统一这些问题,并为读者提供考虑这些版本更改的概述。

问题

  • 何时使用staticinlineexternconstconstexpr作为全局变量?
  • 历史上答案如何变化(C++17 之前/之后,C++20 之前/之后)?
  • 答案如何根据全局变量所在的位置(标头/源/模块)而变化?

c++ constants global-variables c++-faq linkage

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

运算符的优先级和结合性是什么?

C++ 中运算符的优先级和结合性是什么?

谁定义了运算符优先级和结合性,以及它与求值顺序有何关系?解释了这些属性如何从语法中出现。然而,我只是对所有规则的列表感兴趣。


这个问题应该是一个社区常见问题解答,可以参考而不是cppreference 文章

c++ grammar c++-faq operator-precedence

-3
推荐指数
1
解决办法
428
查看次数