我有以下代码.
#include <iostream>
int * foo()
{
int a = 5;
return &a;
}
int main()
{
int* p = foo();
std::cout << *p;
*p = 8;
std::cout << *p;
}
Run Code Online (Sandbox Code Playgroud)
而代码只是运行而没有运行时异常!
输出是 58
怎么会这样?本地变量的内存不能在其功能之外无法访问吗?
考虑以下.
#include <string>
using std::string;
string middle_name () {
return "Jaan";
}
int main ()
{
string&& danger = middle_name(); // ?!
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这不会计算任何东西,但它编译时没有错误,并演示了一些让我感到困惑的事情:danger是一个悬空引用,不是吗?
这可能是显而易见的,但我认为这对我来说很难.鉴于这种:
void test(std::string&&) { }
std::string x{"test"};
test(std::move(x)); // ok
Run Code Online (Sandbox Code Playgroud)
此代码test() 使用rvalue引用作为参数调用,以便程序按照我的预期进行编译.
现在看看这个:
void other_test(const std::string&) { }
std::string x{"test"};
other_test(std::move(x)); // ok???
Run Code Online (Sandbox Code Playgroud)
在这里,我倾斜了.为什么这个版本会编译?所述std::move返回一个&&类型; 为什么我在第二种方法中没有出现错误const&?
我知道
int&& s = 5;
const int& s = 5;
Run Code Online (Sandbox Code Playgroud)
是有效的,因为在这两种情况下我提供的东西都没有左值,它没有地址.是&&与const&相同呢?如果不是,有区别吗?
有一个简单的程序
#include <stdio.h>
int counter = 3;
const int& f() {
return counter++;
}
const int& g() {
return counter++;
}
const int& h(int w) {
counter = w;
return counter;
}
void main()
{
const int& x = f();
const int& y = g();
const int& z = g();
const int& t = h(123);
counter = 45678;
printf("%d %d %d %d", x, y, z, t);
}
Run Code Online (Sandbox Code Playgroud)
为什么它的输出是5 5 5 45678?特别是,为什么x和y是5?如果初始化后它们仍然连接到计数器,为什么它们不是 45679 或类似的东西?