昨天,我和我的同事不确定为什么语言禁止这种转换
struct A { int x; };
struct B : virtual A { };
int A::*p = &A::x;
int B::*pb = p;
Run Code Online (Sandbox Code Playgroud)
甚至演员都没有帮助.如果基本成员指针是虚拟基类,为什么标准不支持将基本成员指针转换为派生成员指针?
相关的C++标准参考:
类型"指向
Bcv类型成员的指针"的prvalueT,其中B是类类型,可以转换为类型为"指向Dcv类型成员的指针"的prvalueT,其中D是派生类(第10条)B.如果B不可访问(第11条),模糊(10.2)或虚拟(10.1)基类D,或虚拟基类的基类D,则需要进行此转换的程序是不正确的.
函数和数据成员指针都会受到影响.
此代码与GCC和Clang编译(并且似乎有效):
#include <iostream>
struct Foo {
enum { number = 42 };
};
int main()
{
Foo bar;
std::cout << bar.number << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,编译器接受了bar.number; 我能找到的所有教科书都可以Foo::number用来访问枚举值.
这段代码有效吗?请注意,GCC给出了一个奇怪的警告("变量'栏'设置但未使用'),而Clang没有抱怨它.
我有一个小C++问题.
在Effective Modern C++的第一页上,有一个例子:
class Widget {
public:
Widget(Widget&& rhs);
};
Run Code Online (Sandbox Code Playgroud)
此外,还有一个评论:'rhs是一个左值,虽然它有一个右值引用类型'.
说实话,我什么都不懂.这是什么意思'rhs是一个左值,但它的类型是右值参考'?
函数参数的生命周期是否等于作为'rvalue'引用传递的未命名临时值(它等于称为函数的表达式)?我的'gcc'编译器显示它是.但我希望看到一个实际的标准文档也说明它(可能是最新的'C++ 11'或'C++ 14').
如何在1,000到20,000之间生成100个随机数,C++中的平均值为9,000?我正在研究C++ 11库,但我找不到允许我包含平均值和范围的方法.