c++ - 与列表初始化语法的自动分配混淆

标签 c++ c++11

我现在才能够在工作中第一次使用 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};
                  ^

我觉得我遗漏了一些明显的东西。我在这里做错了什么?

(我的样本是 on coliru )。

最佳答案

当您使用函数符号进行类型转换时,类型名称必须是simple-type-specifiertypename-specifier(§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};

关于c++ - 与列表初始化语法的自动分配混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25331889/

相关文章:

c++ - 如何模拟时间的流逝来调试程序?

c++ - 从透视图到正交图

c++ - 在 C++ 中组合前缀 &* 操作

c++ - 初始化 vector 时出错

c++ - 固定宽度整数类型 std::uint8_t 和 std::int8_t 的实现,C++

c++ - C++ 编译器如何在 C++0x 中实现线程本地存储?

c++ - 在共享内存中移动 boost::interprocess::string

c++ - 设置子模块目标的输出目录时 CMAKE_BINARY_DIR 和 PROJECT_BINARY_DIR 之间的权衡

c++ - 为什么我在 C++ 中得到 "error: expected ' }'"但在 C 中却没有?

c++ - 成员模板函数不能是虚拟的 - 解决方法?