作为我前一个问题的一个有趣的后续(虽然不具有重大的实际意义): 为什么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似乎有点奇怪)
我希望有一个看起来像这样的课程:
template <typename T>
class foo
{
public:
template <typename S>
foo()
{
//...
}
};
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何调用构造函数.显然,我可以通过给foo()一个S类型的参数来完成这项工作,但它可以在没有任何参数的情况下完成吗?
--Ron