C 11 中的“return {}”语句是什么意思?

新手上路,请多包涵

声明是什么

return {};

在 C++11 中指示,以及何时使用它而不是(比如说)

 return NULL;

或者

return nullptr;

原文由 Pedia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.5k
2 个回答

return {}; 表示“返回一个用空 列表初始化器 初始化的函数返回类型的对象”。确切的行为取决于返回对象的类型。

来自 cppreference.com (因为 OP 被标记为 C++11,所以我排除了 C++14 和 C++17 中的规则;有关详细信息,请参阅链接):

  • 如果花括号初始化列表为空且 T 是具有默认构造函数的类类型,则执行值初始化。

  • 否则,如果 T 是聚合类型,则执行聚合初始化。

  • 否则,如果 T 是 std::initializer_list 的特化,则根据上下文,从花括号初始化列表中直接初始化或复制初始化 T 对象。

  • 否则,将分两个阶段考虑 T 的构造函数:

    • 所有将 std::initializer_list 作为唯一参数或作为第一个参数(如果其余参数具有默认值)的构造函数都将被检查,并通过重载决议与 std::initializer_list 类型的单个参数进行匹配
    • 如果前一阶段没有产生匹配,则 T 的所有构造函数都参与重载决议,以对抗由括号初始化列表的元素组成的参数集,并限制只允许非缩小转换。如果此阶段生成一个显式构造函数作为复制列表初始化的最佳匹配,则编译失败(注意,在简单的复制初始化中,根本不考虑显式构造函数)。
  • 否则(如果 T 不是类类型),如果花括号初始化列表只有一个元素,并且 T 不是引用类型或者是与元素类型兼容的引用类型,则 T 是直接的已初始化(在直接列表初始化中)或复制初始化(在复制列表初始化中),但不允许缩小转换。

  • 否则,如果 T 是与元素类型不兼容的引用类型。 (如果引用是非常量左值引用,则会失败)

  • 否则,如果括号初始化列表没有元素,则 T 是值初始化的。

在 C++11 之前,对于返回 std::string 的函数,您可以编写:

 std::string get_string() {
    return std::string();
}

使用 C++11 中的大括号语法,不需要重复类型:

 std::string get_string() {
    return {}; // an empty string is returned
}

return NULLreturn nullptr 应该在函数返回指针类型时使用:

 any_type* get_pointer() {
    return nullptr;
}

但是, NULL 自 C++11 起已弃用,因为它只是整数值 (0) 的别名,而 nullptr 是真正的指针类型:

 int get_int() {
    return NULL; // will compile, NULL is an integer
}

int get_int() {
    return nullptr; // error: nullptr is not an integer
}

原文由 rgmt 发布,翻译遵循 CC BY-SA 3.0 许可协议

这可能令人困惑:

 int foo()
{
  return {};   // honestly, just return 0 - it's clearer
}

这可能不是:

 SomeObjectWithADefaultConstructor foo()
{
  return {};
  // equivalent to return SomeObjectWithADefaultConstructor {};
}

原文由 Richard Hodges 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏