C++中MyType(myVar)声明的意义何在

What is the point of MyType(myVar) declaration in C++?

本文关键字:声明 MyType myVar C++      更新时间:2023-10-16

在c++11标准中,我们可以用一种不同寻常的方式声明变量。我们可以将myVar声明为int(myVar);而不是int myVar。这有什么意义?

#include <iostream>
using namespace std;
int main() {
    int(myVar);
    myVar = 1000;
    cout << myVar << endl;
    return 0;
}

UPD事实上,我问这个问题有一定的原因。当我们试图将一些代码从MSVC C++03移植到GCC C++11时,看起来很无辜的东西就停止了编译。以下是的示例

    #include <iostream>
    using namespace std;
    struct MyAssert
    {
        MyAssert(bool)
        {
        }
    };
    #define ASSERT(cond) MyAssert(cond)
    void func(void* ptr)
    {
        ASSERT(ptr); // error: declaration of ‘MyAssert ptr’
                    // shadows a parameter #define ASSERT(cond) MyAssert(cond)
    }
    int main()
    {
        func(nullptr);
        return 0;
    }

当然。我甚至可以做到:

int (main)()
{
}

括号用于在C和C++中对事物进行分组。除了分组之外,它们通常没有其他意义。函数调用/声明/定义有点特殊,但如果您需要说服我们不应该在那里省略它们,只需看看Ruby,在函数调用中括号是可选的。

这不一定有意义。但有时能够加上一些理论上不必要的括号有助于使代码更容易阅读。当然,在你的例子中没有,在我的例子中也没有。

#include <typeinfo>
#include <iostream>
int     main(void)
{
  int   *first_var[2];
  int   (*second_var)[2];
  std::cout << typeid(first_var).name() << std::endl;
  std::cout << typeid(second_var).name() << std::endl;
  return 0;
}

在我的机器上运行此程序会得到:

A2_Pi
PA2_i

声明中的括号大多与它们在任何地方所起的作用相同,将应该放在一起的东西分组,而不考虑语言的默认优先级顺序。当然,括号内只有一个元素就相当于只键入该元素,除非括号是强制性的(例如函数调用(。

C++不会破坏向后兼容性(如果有帮助的话(。

它是从C语言发展而来的。所以C++继承了它。

这种向后兼容性的一个副作用是令人烦恼的解析问题。事实证明,它们没有足够的烦恼来证明打破向后兼容性是合理的。