相关疑难解决方法(0)

函数调用参数中的构造函数样式转换

我不明白为什么以下代码在使用构造函数样式的转换时无法编译:

template<typename T> void foo(const T& t){}

int main(){
  foo(unsigned char(0));
}
Run Code Online (Sandbox Code Playgroud)

错误是:

  • error: expected primary-expression before ‘unsigned’ 对于gcc.
  • error: expected '(' for function-style cast or type construction 为了铿锵

但是这三种语法是正确的:

template<typename T> void foo(const T& t){}

int main(){
  // c-style cast
  foo((unsigned char)0);

  // without unsigned
  foo(char(0));

  // aliased unsigned char
  typedef unsigned char uchar;
  foo(uchar(0));
}
Run Code Online (Sandbox Code Playgroud)

所以这种类型的空间显然应该归咎于此.

我认为它可能与我们的老朋友有点相关的最令人烦恼的解析,所以我尝试了统一初始化语法,这应该摆脱这种模糊,但没有运气:

template<typename T> void foo(const T& t){}

int main(){
  foo(unsigned char{0});
}
Run Code Online (Sandbox Code Playgroud)

但仍然:

  • error: expected primary-expression before ‘unsigned’ …

c++ casting c++11

19
推荐指数
1
解决办法
2790
查看次数

显式类型转换和多个简单类型说明符

要初始化类型的对象T,可以执行以下某项操作:

T x = T();
T x((T()));
Run Code Online (Sandbox Code Playgroud)

我的问题涉及由简单类型说明符组合指定的类型,例如unsigned int:

unsigned int x = unsigned int();
unsigned int x((unsigned int()));
Run Code Online (Sandbox Code Playgroud)

Visual C++ 2008和英特尔C++编译器11.1接受这两个没有警告; Comeau 4.3.10.1b2和g ++ 3.4.5(不可否认,并非特别近期)没有.

根据C++标准(C++ 03 5.2.3/2,expr.type.conv):

表达式T(),其中T是非数组完整对象类型的简单类型说明符(7.1.5.2)或(可能是cv限定的)void类型,创建指定类型的rvalue,它是值初始化的

7.1.5.2说,"简单类型说明符是",并跟随一个包含unsigned和的列表int.

因此,鉴于在5.2.3/2中,"simple-type-specifier"是单数,unsigned并且int是两个类型说明符,上面的例子是否使用unsigned int无效?(如果是这样,后续是,微软和英特尔是否支持所述表达式?)

这个问题更多是出于好奇而不是其他任何问题; 对于由多个简单类型说明符组合指定的所有类型,值初始化等效于零初始化.(这个问题是由回答关于初始化问题的答案评论提示的).

c++ value-initialization

8
推荐指数
1
解决办法
1800
查看次数

标签 统计

c++ ×2

c++11 ×1

casting ×1

value-initialization ×1