【问题标题】:Why does "std::string(blablabla());" compile without errors?为什么“std::string(blablabla());”编译没有错误?
【发布时间】:2016-01-21 08:36:33
【问题描述】:

为什么下面的代码编译时没有警告。请注意,blablabla() 没有在任何地方定义。

我在 gcc 5.1.0clang-3.7.0 中对其进行了测试(带有和不带有 -std=c++11 标志)。

#include <string>

int main()
{
    std::string(blablabla());
}

这个问题不是重复最令人头疼的解析歧义,因为相关示例声明了带有参数的函数。

【问题讨论】:

  • 如果我猜测一下,该语句已被优化,因为您根本没有以任何方式使用它。您没有将字符串分配给变量,也没有将其传递给函数。因此,编译器很可能会“忽略”它。但这是一个猜测。
  • 警告应该独立于任何最近的编译器中的任何优化。
  • std::string(blablabla());std::string blablabla();不一样吗?
  • @oo_miguel - 这是标准的 C 声明语法。有时需要(),例如在创建指向函数int (*f)(); 的指针与返回指针int* f(); 的函数不同时。 允许使用额外的(),即使不是严格需要,因为这使语言描述更简单。

标签: c++ c++11 compilation compiler-errors


【解决方案1】:

啊,我是个笨蛋。

它不被视为调用。编译器只是将其视为声明...

试试,比较一下:

int main() {
    int(blablabla);
}

这给出了:

test.c++: In function ‘int main()’:
test.c++:6:9: warning: unused variable ‘blablabla’ [-Wunused-variable]
     int(blablabla);
         ^

更准确地说,您的语句std::string(blablabla()) 声明blablabla 是一个返回std::string 的函数,与

std::string blablabla();

会的。本地函数声明。

【讨论】:

  • 是 int(blablabla);与声明 int blablabla 相同; ?
  • Ramana:是的,你只是将标识符括起来。插入一个空格会更清楚:int ((((blablabla))));。顺便说一句,在某些情况下甚至需要括号,即在声明函数指针时(将星号附加到标识符而不是返回类型)。
  • @Ramana 是的,线索是它警告变量blablabla 没有被使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2012-10-19
  • 2020-06-17
相关资源
最近更新 更多