在clang的C++ 11状态页面中遇到了一个名为"rvalue reference for*this"的提案.
我已经阅读了很多关于rvalue引用并理解它们的内容,但我认为我不知道这一点.我也无法使用这些条款在网上找到太多资源.
页面上的提案文件有一个链接:N2439(将移动语义扩展到*this),但我也没有从中获得太多的例子.
这个功能是什么?
我问这个问题有两种不同的语言:C和C++.
调用具有相反整数符号期望的函数时,最佳做法是什么?
例如:
uint32 _depth; // uint32 = DWORD
int depth;
_BitScanForward(&_depth, (uint32)input); // DWORD, DWORD
depth = (int)_depth;
Run Code Online (Sandbox Code Playgroud)
_BitScanForward期待DWORD(uint32)参数.变量input是int16类型,我需要_depth在我的代码中将结果作为int32 处理.
input如图所示的铸造吗?我知道编译器可能会为我做,但最佳做法是什么?_depth为int32 是否可以接受,因此避免如后所示将其强制转换为?注意:
我对编译器的评论是基于经验的.我编写的代码在VS中没有警告编译但在执行时崩溃.原来我正在调用一个incorect width int的函数.所以我不再把这个话题留给编译器了.
编辑:
答案很有帮助,谢谢.让我提炼我的问题.如果没有宽度问题,即函数不期望比传入的更窄的int(obvioulsy将失败),那么依靠编译器来处理符号和宽度差异是否可以?
以下代码
#include <string>
struct Foo {
operator double() {
return 1;
}
int operator[](std::string x) {
return 1;
}
};
int main() {
Foo()["abcd"];
}
Run Code Online (Sandbox Code Playgroud)
使用g ++进行编译很好,但由于声明的方法和本机运算符之间存在歧义,因此使用clang和intel编译器会失败[].
如果Foo有一个隐式转换int,我会很清楚,但转换是这样的double.这不是解决歧义吗?
以下代码在gcc 7.3.0中编译良好,但不与clang 6.0.0编译.
#include <string>
struct X {
X() : x(10) {}
int operator[](std::string str) { return x + str[0]; }
template <typename T> operator T() { return x; } // (1) fails only in clang
//operator int() { return x; } // (2) fails both in gcc and clang
private:
int x;
};
int main() {
X x;
int y = 20;
int z = int(x);
return x["abc"];
}
Run Code Online (Sandbox Code Playgroud)
我使用命令clang++ 1.cpp -std=c++98指定不同的标准版本.我试过c ++ 98,11,14,17,2a.在所有情况下,错误都是相同的.clang中的错误消息如下:
1.cpp:14:13: error: use …Run Code Online (Sandbox Code Playgroud)