gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:50:31 25 4
gpt4 key购买 nike

考虑以下代码:

struct Foo {};

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

上面的代码在 Clangv3.5 中编译良好和 GCCv4.9 .

但是,它在VC++2013中编译失败。

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

struct Foo {};

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

问题 1:

这是 Visual Studio 的错误吗?

Q2:

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

最佳答案

精心设计的类型说明符 的要点是允许您从 draft C++ standard 中引用一个已隐藏的名称3.4.4 详尽的类型说明符部分:

An elaborated-type-specifier (7.1.6.3) may be used to refer to a previously declared class-name or enum-name even though the name has been hidden by a non-type declaration (3.3.10).

因此在隐藏 Foo 的情况下,您将不得不使用精心设计的类型说明符:

struct Foo {};

void Foo()
{
}

我在 7.1.6.3 详细的类型说明符14 模板 中看不到任何可以阻止这种使用的内容。事实上,从 CS2989 的描述来看,它看起来像Visual Studio 感到困惑,并认为您正在尝试将非模板类重新定义为模板类。

所以这对我来说看起来像是一个错误,所以我会提交 bug report .

更新

提交了 bug report .

关于c++ - 使用结构标识符来表示 POD 类型和 C 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26755400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com