用其他类型的函数声明违反C ++中的类型安全性?

时间:2016-03-25 16:40:05

标签: c++ type-conversion type-safety

我是C ++的新手,只是尝试一下。我坚持使用以下代码:

#include<iostream>  

void t(){
    std::cout << "func t()" << std::endl;
}

int main(int argc, char **argv) {
    int t(); //declaration of function
    std::cout << t() << std::endl;
}

输出为“func t()\ n6295712”。我担心的是由t()打印的随机(?)数字。

我的问题是:为什么允许声明另一个返回类型的函数(这里:int而不是void)而没有任何错误?这不违反类型安全性,因为我从未使用返回类型“int”定义函数吗?

使用的编译器:gcc(Ubuntu 4.8.4-2ubuntu1~14.04.1)4.8.4

1 个答案:

答案 0 :(得分:4)

我能找到的唯一相关内容是[basic.scope.pdecl]中的注释:

  

块作用域中的函数声明和使用块作用域中的extern说明符的变量声明引用作为封闭命名空间成员的声明,但它们不会在该作用域中引入新名称。

所以当你写:

// Retrieve the list of videos uploaded to the authenticated user's channel.
          var playlistItemsListResponse = await playlistItemsListRequest.ExecuteAsync();

该内部声明引用封闭命名空间的成员。所以这相当于写了:

ExecuteAsync

但是函数不能仅仅在返回类型中过载,因此这段代码是错误的。 Clang拒绝这两个程序,gcc只拒绝后者。我相信这是一个gcc bug。