相关疑难解决方法(0)

C++中指针变量和引用变量之间有什么区别?

我知道引用是语法糖,因此代码更容易读写.

但有什么区别?


以下答案和链接摘要:

  1. 指针可以重新分配任意次数,而在绑定后无法重新分配引用.
  2. 指针可以指向nowhere(NULL),而引用总是指对象.
  3. 您不能使用指针来获取引用的地址.
  4. 没有"参考算术"(但您可以获取引用所指向的对象的地址,并对其进行指针运算&obj + 5).

澄清一个误解:

C++标准非常谨慎,以避免规定编译器如何实现引用,但每个C++编译器都将引用实现为指针.也就是说,声明如下:

int &ri = i;
Run Code Online (Sandbox Code Playgroud)

如果它没有完全优化,则分配与指针相同的存储量,并将地址i放入该存储中.

因此,指针和引用都使用相同数量的内存.

作为基本规则,

  • 使用函数参数和返回类型中的引用来提供有用的自我文档化接口.
  • 使用指针实现算法和数据结构.

有趣的读物:

c++ pointers reference c++-faq

3115
推荐指数
34
解决办法
94万
查看次数

const ++在C++中的行为

这是我的问题,问题出在评论中

const int a = 5;
const_cast<int&>(a)=7; //throw over const attribute in a,and assign to 7
std::cout<<a<<std::endl; //why still out put 5!!!!!!!!!!
Run Code Online (Sandbox Code Playgroud)

谁可以告诉我为什么,有些书籍会考虑这些问题来推荐?谢谢!

c++ const-cast undefined-behavior

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

(const) 类对象销毁期间的成员访问

如果添加任一注释行,以下程序是否具有 UB?

#include<atomic>
#include<iostream>
#include<thread>

std::atomic<bool> a = false;

struct T {
    int i;
    void reset() { i = 0; }
    ~T() {
        while(!a);
        //reset();
        a = false;
        while(!a);
    }
};

int main() {
    std::thread x;
    {
        const T t{42};
        x = std::thread([&t]{
            std::cout << t.i << "\n";
            a = true;
            while(a);
            //const_cast<T&>(t).reset();
            //const_cast<int&>(t.i) = 0;
            std::cout << t.i << "\n";
            a = true;
        });
    }
    x.join();
}
Run Code Online (Sandbox Code Playgroud)

GCC 打印42后跟0,而 Clang 打印42两次:https://godbolt.org/z/j544rq3cx

如果 …

c++ multithreading lifetime language-lawyer

5
推荐指数
0
解决办法
149
查看次数

constexpr和未定义的行为

该代码在GCC 8中编译,但不在GCC 7和clang中编译。

constexpr int a = 1;
constexpr int b = --const_cast<int&>(a);
Run Code Online (Sandbox Code Playgroud)

这显然是UB。

我的问题:Standardese对评估包含UB的constexpr有什么看法-此代码应该完全编译吗?

c++ undefined-behavior language-lawyer constexpr

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