作为对我之前的问题的有趣的跟进(尽管不是很重要), 为什么在声明变量时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);
}
使用g ++ 4.9.2进行编译会给我以下编译错误:
main.cpp:16:10: error: cannot call constructor 'C::C' directly [-fpermissive]
它已成功与MSVC2013 / 2015一起编译并打印
C (B *)
使用clang 3.5成功编译并打印
C
那么强制性的问题是哪个是对的?:)
(尽管我强烈地转向了clang版本,但是从技术上仅用其typedef更改类型后,msvc停止声明变量的方法似乎有点奇怪)
C::C
没有命名类型,而是命名函数,所以GCC是正确的imo。
C::C y;
没道理吧?C::C (y);
最初我都不认为这是Most-Vexing-Parse stackoverflow.com/questions/tagged/most-vexing-parse的一个实例,但是现在我认为这只是未定义的行为,意味着所有三个编译器都是“正确的”。