- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我遇到了一些这样的代码:
struct A {
A() {}
A(int) {}
};
struct B : A {
void init(int i);
};
void B::init(int i) {
A::A(i); // what is this?
}
int main() {
B b;
b.init(2);
}
这使用 VC11 beta 编译和运行,没有错误或/W4 警告。
明显的意图是调用 B::init 来重新初始化 B 的 A 基础子对象。我相信它实际上被解析为一个名为 i
且类型为 A
的新变量的变量声明。使用 clang 编译会产生诊断信息:
ConsoleApplication1.cpp:11:14: warning: declaration shadows a local variable
A::A(i);
^
ConsoleApplication1.cpp:10:22: note: previous declaration is here
void B::init(int i) {
^
ConsoleApplication1.cpp:11:14: error: redefinition of 'i' with a different type
A::A(i);
^
ConsoleApplication1.cpp:10:22: note: previous definition is here
void B::init(int i) {
^
奇怪的是,可以使用冗余类限定来引用该类型。
此外,A::A(i)
似乎被 VS11 和 clang/gcc 解析不同。如果我执行 A::A(b)
,clang 和 gcc 使用默认构造函数创建类型为 A
的变量 b
。 VS11 错误地指出 b
is an unknown identifier。 VS11 似乎将 A::A(i)
解析为使用构造函数 A::A(int)
创建临时 A
i
作为参数。当冗余限定符被消除时,VS 将源解析为变量声明,就像 clang 和 gcc 所做的那样,并产生关于隐藏变量 i
的类似错误。
解析中的这种差异解释了为什么 VS11 会阻塞多个额外的限定符; A::A::A::A(i)
,以及为什么,鉴于 clang 和 gcc 可以接受一个额外的限定符,任何多于一个的数字都与一个额外的结果相同。
这是另一个在不同上下文中使用冗余限定符的示例。所有编译器似乎都将其解析为临时构造:
class Foo {};
void bar(Foo const &) {}
int main() {
bar(Foo::Foo());
}
class D : B { using B::B; };
) 但VS似乎允许它任何地方。在如何解析冗余限定符方面,VS 是错误的吗?clang 和 gcc 是正确的吗?B b(A::A(i));
被 clang 和 gcc 解析为最令人烦恼的解析,但 VS 将其视为声明变量 b类型为 B
的
带有一个初始值设定项。这么严重的差距还有很多吗?最佳答案
虽然这种现象可能归因于类名注入(inject),但正如 ephemient 的回答中所指出的,对于这个特定的例子,它在很久以前就被 C++ 语言禁止了。
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#147
组合 A::A
需要引用类构造函数,而不是类注入(inject)名称。 A::A(i)
应该被兼容的编译器解释为涉及构造函数名称的非法(因此无意义)表达式。例如,Comeau 编译器将因此拒绝编译您的代码。
显然 VC11 继续将 A::A
视为对注入(inject)类名的引用。有趣的是,我在 VS2005 中没有观察到这个问题。
在 A::A
被解释为引用注入(inject)名称的那一天,我们可以将 A
对象声明为
A::A::A::A::A::A a;
等等,有任意数量的A
。但现在不是了。令人惊讶的是,ideone使用的GCC版本(4.3.4?)仍然存在这个问题
你可以用你的 VC11 版本试试这个,看看它是否允许。
关于c++ - 为什么允许冗余类名限定符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11423380/
我一直在使用 OpenGL 编写程序。最近,我开始学习OpenGL着色语言。我是新手;因此,请在回答中详细说明。 我的问题是: GLSL 中有哪些不同类型的变量(限定符)? 它们的用途是什么? 它们有
这个问题在这里已经有了答案: typedef pointer const weirdness (6 个答案) 关闭 8 年前。 我有一个结构体 type_s。然后我将指向 struct type_s
我有一个 Point2D 类如下: class Point2D{ int x; int y; public: Point2D(int inX,
当应用于指向指针的指针等时,我在推断什么是 const 时遇到了一些麻烦。即,什么是 const 当你有 const Foo **foo; 我可以在这里更改 **foo 中的内容吗?如 foo[0]
限定符 有时候不知道要匹配多少字符。为了能适应这种不确定性,正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。 下表给出了各种限定符及其含义的说
我有一个包含字符名称的数组结构。我想使用 qsort 按字母顺序对它们进行排序,但是我一直收到一条错误消息,说“初始化丢弃了指针目标类型中的‘const’限定符”。我相信我的 cmpmi() 函数和
我是 Java EE/JSF 的新手,现在阅读 CDI 限定符 - 更改类实现的可能性。这很好,但我有一个问题。据我了解,我可以使用限定符更改类实现,但我需要在使用此实现的任何地方更改它。在一个地方进
假设我有以下目录结构: $ mkdir -p a/1 $ ln -s a b 查找目录,我也得到了符号链接(symbolic link)中的目录: $ print -l */*(/) a/1 b/1
我正在尝试创建一个 const 结构数组,但我不断得到 error initializer element is not a compile time constant 我使用的是keil IDE。这
#include using namespace std; class Point { private: int x, y; // Private data members public:
我想使一个方法有条件地成为常量。也就是说,我们有 template class A { // stuff }; 根据模板参数的值,要么 void method() const; 或 void
由于 const int 特化导致以下错误: #include using std::cout; using std::endl; template void g(T val) { cou
同时适用于移动设备和平板电脑的 Titanium 项目,完美地完成了移动版本,但在平板设计时面临一些复杂性。 下面是 Titanium 支持的限定符矩阵,但我找不到任何针对 Android-Table
我正在研究 C++ 和 gtkmm,试图创建一个自定义类,它调用 .glade 文件来构建一个 Gtk 而不是基本的界面。此类派生自 Gtk::Window,但是当我调用类本身的 get_widget
我编写了以下代码来测试 const 成员函数:当我有数据成员的 const 限定符时,它编译并运行良好char *data 和构造函数的参数。但是,如果我从中删除 const数据成员和构造函数,我得到
您好,我正在使用 C++ 内置算法。我这里有这段代码: #include #include #include using namespace std; bool isDon(string& na
我的问题与 Time 项目有关,我将在下面完整发布该项目以提供背景信息。我所做的大部分都是正确的,但是当涉及到加法和减法运算符定义时,我遇到了范围界定错误的问题。编译器找不到我的私有(private)
我有以下代码- int acb(const uint16 *MsgPtr) { uint16 *p = (MsgPtr + 1); printf("%d", *p); } 我收到以下警告 - 在为 p
我在结构中有一个指向结构实例链表的指针字段。 struct myStruct { some fields... struct list_objects * volatile list;
所以我在维基百科的一篇文章(粗略翻译)中遇到了以下定义: Modifier (programming) - element of source code being a phrase of given
我是一名优秀的程序员,十分优秀!