与列表初始化语法的自动赋值混淆
Confusion with auto assignment with list initialization syntax
我现在才能够在我的工作中第一次使用c++ 11,我正在边走边学习。我已经阅读了GotW #94,我正在尝试采用他的建议,在声明局部变量时使用auto
,而不是显式地声明类型。
class foo
{
};
int main()
{
auto f = foo const*{nullptr};
}
我在main中的赋值不能编译,使用
失败main.cpp: In function 'int main()':
main.cpp:13:18: error: expected primary-expression before 'const'
auto f = foo const*{nullptr};
^
我觉得我错过了一些明显的东西。我哪里做错了?
当您使用函数符号进行类型转换时,类型名必须是简单类型说明符或类型说明符 (§5.2.3 [expr.type.conv]),这基本上意味着类型名由单个单词组成。
unsigned int a = unsigned int(42);
也会失败,并且没有涉及类型推断或列表初始化。
在我看来,在你的例子中使用auto
相当于混淆。只需使用
foo const* f{nullptr};
如果必须使用auto
,请创建别名
using foo_const_p = foo const*;
auto f = foo_const_p{nullptr};
T(x)
和T{x}
语法不允许对T
使用任意类型。允许它在某些情况下会使语法变得相当复杂。如果真的想在这里使用auto
,则需要将该类型换行,如下所示:
template <typename T> using id = T;
auto f = id<foo const*>{nullptr};
但我个人认为它在这里没有什么用。
更具体地说,c++语法将语法结构定义为 <>之前<我>后缀表达式:...simple-type-specifier (expression-listopt)...<我> simple-type-specifier <我> braced-init-list ...<我> simple-type-specifier ::: <子>选择子><我> nested-name-specifier <子>选择子><我>类型名称::optnested-name-specifier template simple-template-id字符char16_tchar32_twchar_t保龄球短int长签署无符号浮动双无效汽车<我> decltype-specifier <我>类型名称:<我>类名称<我> enum-name <我>类型名<我> simple-template-id 之前允许任意类型的语法是type-id
规则的一部分,它不是simple-type-specifier
的选项之一,但却是simple-template-id
中的template-argument
规则的可能性之一,这就是为什么模板别名是一种有效的解决方案。
相关文章:
- 初始值设定项列表与构造函数赋值与变量定义
- 为什么我可以在不使用赋值运算符的情况下使用列表初始化普通数组
- 如何让迭代器使用赋值运算符对列表进行操作
- 避免在 ctor 初始值设定项列表中的字符串赋值中使用双重调用函数
- 大括号初始化列表和赋值
- C++初始化复制构造函数中的列表赋值,并在复制构造函数中崩溃
- 实现双向有序列表,如何返回指针以便可以为其赋值
- 在没有初始化列表的情况下,在c++的headerfile中为const int赋值
- 双向循环列表中的赋值运算符以错误的顺序添加元素
- 初始化变量列表中的赋值顺序是否未定义
- 实际参数列表中的赋值运算符
- 初始值设定项列表程序运行良好,但直接赋值时无法正常工作
- 如何通过赋值运算符重载将一个列表复制到另一个列表上?C++
- 有没有一种方法可以使用std::array与文字或初始值设定项列表进行比较,就像使用赋值一样
- 使用变量参数列表为传递的引用赋值(VS2010中出错)
- 带有初始值设定项列表的字符串赋值
- 错误:从初始值设定项列表向数组赋值;在ubuntu 1004上工作但在14.04上不工作的代码
- C++从初始值设定项列表中赋值给数组
- 初始化程序列表和赋值重载(运算符=)
- 为什么在逗号分隔的值列表周围放括号会改变赋值