我想知道以下问题是否有一个优雅的解决方案:
假设我想让一个变量保存一个非常复杂的类型的值,并且编译器会自动推断它的类型,但是由于在if语句中进行了初始化,因此在代码中先声明然后在后面给出值。
例如:
{
auto a;
if (some predicate)
a = init_a(1);
else
a = init_a(2);
}
显然,这些代码无法编译,但是我认为编译器具有推断类型所需的所有信息。如果'a'只是一个整数,那么这不是问题,但是如果类型是一个复杂的模板,我就不必编写它(或者在某些情况下甚至不知道)。
另外,我不想调用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/