我有一个类似 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?
所以,我知道字符串文字的类型为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。
假设我有一些简单的东西:
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) 更有效吗?
还有一本书可以优雅地涵盖这个主题吗?