使用结构标识符来表示POD类型和C结构

101*_*010 8 c++ struct c++11 visual-studio-2013 c++14

考虑以下代码:

struct Foo {};

template<typename ForwardIterator>
struct Foo*
Bar(ForwardIterator first, ForwardIterator last)
{ 
    (void)first;
    (void)last;
    Foo *foo(nullptr);
    return foo;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在Clangv3.5GCCv4.9中编译得很好.

但是,它无法在VC++ 2013中编译.

struct从返回类型中删除标识符(见下文)可以解决问题:

struct Foo {};

template<typename ForwardIterator>
Foo*
Bar(ForwardIterator first, ForwardIterator last)
{ 
    (void)first;
    (void)last;
    Foo *foo(nullptr);
    return foo;
}
Run Code Online (Sandbox Code Playgroud)

Q1:

这是一个视觉工作室的错误吗?

Q2:

这个问题出现了,因为在我的代码库中,它Foo struct位于一个.h.c文件中(即,是一个C struct),为了struct在我的代码中表示C/POD ,我使用了struct标识符.这是一个坏主意(即,在C++代码中我应该避免以struct这种方式使用标识符)?

Sha*_*our 7

精心设计的类型说明符的要点是允许您从草案C++标准部分3.4.4 Elaborated类型说明符中引用已隐藏的名称:

精心设计的类型说明符(7.1.6.3)可用于引用先前声明的类名或枚举名,即使该名称已被非类型声明隐藏(3.3.10).

所以在Foo隐藏的情况下,你必须使用精心设计的类型说明符:

struct Foo {};

void Foo()
{
}
Run Code Online (Sandbox Code Playgroud)

我在7.1.6.3 Elaborated类型说明符14 模板中看不到任何会阻止此用法的内容.事实上,从CS2989的描述看起来,Visual Studio变得混乱并认为您正在尝试将非模板类重新定义为模板类.

所以这看起来像是一个bug,所以我会提交错误报告.

更新

提交了一份错误报告.