首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >模板类中静态字段的初始化程序列表在clang中失败

模板类中静态字段的初始化程序列表在clang中失败
EN

Stack Overflow用户
提问于 2013-01-14 12:29:46
回答 1查看 513关注 0票数 6

以下代码片段在g++和clang++下运行良好:

代码语言:javascript
运行
复制
// bsp1.cc
class A {
public:
  A(int, char const *);

  int value;
  const char * name;
};

class B {
public:
  static const A many_as[];
};

A const B::many_as[] 
{ { 0, "zero" }, 
    { 1, "one" }, 
    { 2, "two" }, 
    { 3, "three" }, 
    { 77, 0 } };

当我将B类更改为模板时:

代码语言:javascript
运行
复制
// bsp2.cc
class A {
public:
  A(int, char const *);

  int value;
  const char * name;
};

template<typename T>
class B {
public:
  static const A many_as[];
};

template<>
A const B< int >::many_as[] 
{ { 0, "zero" }, 
  { 1, "one" }, 
  { 2, "two" }, 
  { 3, "three" }, 
  { 77, 0 } };

clang++在以下方面失败:

代码语言:javascript
运行
复制
tmp/bsp2.cc:19:1: error: expected ';' after top level declarator
{ { 0, "zero" }, 
^
1 error generated.

g++仍然对此感到满意。

版本信息: g++ (Debian4.7.2-4) 4.7.2,clangVersion3.3(主干171722)

当我将=添加为

代码语言:javascript
运行
复制
A const B< int >::many_as[] =

clang++也很高兴。

我的问题:

  1. bsp2.cc有效吗?(换句话说:这是clang++的问题吗?)
  2. 有和没有bsp2的=之间有什么语义上的区别吗?(也就是说,我可以使用=的版本作为“解决办法”吗?)
  3. (额外的问题:)你能告诉我C++ 11标准中描述这一点的段落吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-14 13:41:26

9.4.2p2指定非模板静态数据成员的定义;隐含地说,它的语法与任何其他定义相同,因此大括号或等号初始化器的大括号列表是绝对好的。14p1和14.5.1.3涵盖了模板静态数据成员的显式专门化的定义,并且通过暗示,静态数据成员的任何有效定义对于模板静态数据成员显式专门化的定义都是有效的。

实际上,14.7.3p13显式演示了在模板静态数据成员显式专门化中使用大括号-init-list来区分默认初始化和定义:

代码语言:javascript
运行
复制
struct X {};
template<typename> struct Q { static X i; };
template<> X Q<int>::i{};

因为clang不能接受标准中的示例中的这个语法,所以很明显,bug是在clang中的。

在这种情况下,您的解决方法是绝对有效的。插入=的语义含义(8.5p14)是直接初始化(8.5p16)变为复制初始化(8.5p15)。由于您的初始化程序是一个带括号的init列表(8.5p17),所以执行列表初始化(8.5.4),并且从直接列表初始化更改为复制列表初始化(8.5.4p1),但是由于您的对象是一个数组,因此是一个聚合(8.5.1p1),因此将执行聚合初始化,这是对直接/复制初始化区别视而不见的。

注意,A上存在一个构造函数,这使得它不能成为一个聚合,这意味着可能在运行时调用构造函数。如果您删除了构造函数,那么A数组将是一个递归聚合,可以在编译时完全初始化(数据将直接放置到您的对象文件中)。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14318426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档