作为我前一个问题的一个有趣的后续(虽然不具有重大的实际意义): 为什么C++允许我们在声明变量时用括号括起变量名?
我发现将括号中的声明与注入的类名称功能相结合可能会导致有关编译器行为的惊人结果.
看看以下程序:
#include <iostream>
struct B
{
};
struct C
{
C (){ std::cout << "C" << '\n'; }
C (B *) { std::cout << "C (B *)" << '\n';}
};
B *y = nullptr;
int main()
{
C::C (y);
}
Run Code Online (Sandbox Code Playgroud)
用g ++ 4.9.2编译给出了以下编译错误:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
Run Code Online (Sandbox Code Playgroud)它与MSVC2013/2015成功编译并打印 C (B *)
它与clang 3.5成功编译并打印 C
因此,强制性问题是哪一个是正确的?:)
(我强烈倾向于clang版本和msvc方式停止声明变量后,只是在技术上改变类型,其typedef似乎有点奇怪)
不允许将名称空间和具有相同名称的类放入一个声明性区域,即
namespace A {}
class A{};
Run Code Online (Sandbox Code Playgroud)
形成不良(见§3.3.1/ 4).但是,可以通过using-directive引入任一个的名称:
namespace N { namespace A {int i;} }
struct A {static int i;};
using namespace N;
int i = A::i; // The global struct, or namespace N::A?
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)main.cpp:7:9: error: reference to 'A' is ambiguous int i = A::i; ^ main.cpp:3:8: note: candidate found by name lookup is 'A' struct A {static int i;}; ^ main.cpp:1:25: note: candidate found by name lookup is 'N::A' namespace N …