小编ken*_*kar的帖子

右值引用还是左值?

我有一个类似 5 年前发布的类似性质的问题: 为什么右值引用变量不是右值?

我主要关心的是为什么我可以这样做:

int&& k = 3;
k++;
Run Code Online (Sandbox Code Playgroud)

但我不能这样做:

(static_cast<int&&>(3))++;
Run Code Online (Sandbox Code Playgroud)

我总是将右值引用解释为左值,因为右值引用变量是左值。但显然情况并非如此。有人可以向我解释为什么(static_cast<int&&>(3))++;结果是using rvalue as lvalue

c++ rvalue-reference

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

为什么 const char[] 一直被转换为 const char*?

所以,我知道字符串文字的类型为const char[N]. 而且我也知道,如果我们const char[]在某个函数中得到一个参数,编译器会自动将其转换为const char*.

但是为什么我总是收到编译器错误消息,说字符串文字的类型为const char*

下面是几个例子:

void f(int x) {}
int main()
{
    f("Hello");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误: invalid conversion from 'const char*' to 'int'

void f() {
    throw "Hello";
}
int main()
{
    try{ f(); } catch (int x) { std::cout << "No\n";}
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在终端: terminate called after throwing an instance of 'char const*'

编辑:我正在使用 GNU GCC。

c++ string-literals

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

是否通过使用数字文字调用函数来创建临时对象?

假设我有一些简单的东西:

void f(int a){...}
int main()
{
   f(3);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我们调用 f(3) 时,初始化是如何在稍低的抽象级别上发生的?临时对象是使用值 3 创建的还是仅通过复制初始化进行初始化?

主要是因为我在这段代码中遇到了这个问题:

void f(int a){...}
void f(int&& a){...}
int main()
{
   f(3);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

...我收到一个错误,说它不明确。因为我很确定调用函数 f(int&& a) 我们得到了一个临时对象的创建,该对象获得了一个引用 a 的生命周期扩展,我还要说调用 f(int a) 也会调用 a暂时的。否则,编译器不应该选择调用 f(int a) 更有效吗?

还有一本书可以优雅地涵盖这个主题吗?

c++ initialization

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