相关疑难解决方法(0)

程序在3个主要的C++编译器中以不同方式编译.哪一个是对的?

作为我前一个问题的一个有趣的后续(虽然不具有重大的实际意义): 为什么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)
  1. 用g ++ 4.9.2编译给出了以下编译错误:

    main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 它与MSVC2013/2015成功编译并打印 C (B *)

  3. 它与clang 3.5成功编译并打印 C

因此,强制性问题是哪一个是正确的?:)

(我强烈倾向于clang版本和msvc方式停止声明变量后,只是在技术上改变类型,其typedef似乎有点奇怪)

c++ language-lawyer

116
推荐指数
2
解决办法
4815
查看次数

使用using-directive进行不明确的名称查找

不允许将名称空间和具有相同名称的类放入一个声明性区域,即

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)

这段代码是不正确的吗?VC++ 和Clang一样认为:

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 …
Run Code Online (Sandbox Code Playgroud)

c++ qualified-name language-lawyer name-lookup

8
推荐指数
1
解决办法
1474
查看次数