c++ - 没有定义的自动变量声明

标签 c++ auto

我想知道以下问题是否有一个优雅的解决方案:
假设我想让一个变量保存一个非常复杂的类型的值,并且编译器会自动推断它的类型,但是由于在if语句中进行了初始化,因此在代码中先声明然后在后面给出值。
例如:

{
  auto a;
  if (some predicate)
      a = init_a(1);
  else
      a = init_a(2);
}
显然,这些代码无法编译,但是我认为编译器具有推断类型所需的所有信息。
如果'a'只是一个整数,那么这不是问题,但是如果类型是一个复杂的模板,我就不必编写它(或者在某些情况下甚至不知道)。
另外,我不想调用a的默认构造函数,然后将其覆盖。
可能的解决方案:
  • 模板'a'的类型。
  • 使用lambda初始化'a'并将谓词移入lambda。
  • 只需编写“a”的类型即可,而不是自动的。
  • 使用void指针/shared_ptr,然后在堆上初始化'a'。

  • 这些中的每一个都有其自身的缺点。
    是否有更优雅的解决方案?

    最佳答案

    编译器没有无限的前瞻性,代码中将进一步发生什么。它只知道当前语句正在发生什么。因此,没有初始化程序就无法推断出任何类型。
    如果您不知道init_a的返回类型,则可以使用 decltype :

    decltype(init_a(1)) a;
    
    您还可以使用lambda调用来初始化变量:
    auto a = [ /* Captures needed for the condition... */ ]()
    {
        if (some_condition)
            return init_a(1);
        else
            return init_a(2);
    }();  // Call the lambda immediately
    
    或者,如许多评论中所述,使用三元条件表达式:
    auto a = some_condition ? init_a(1) : init_a(2);
    

    关于c++ - 没有定义的自动变量声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64444867/

    相关文章:

    c++ - 将 auto 关键字替换为推导类型(clang 或 VS2010)

    c++ - 如何在 x86-64 上优化 C 和 C++ 中的函数返回值?

    c++ - 枚举和指向成员的指针

    C++:奇怪的段错误

    c++ - 如何正确实现自动迭代器

    c++ - 如何在C++中获取自动变量的类型

    c++ - 为什么在使用STL列表时不能使用此回文功能?

    C++成员函数模板的隐式实例化

    c++ - ustream 是如何工作的?

    c++ - `static constexpr auto` 使用未命名枚举初始化的数据成员