我可以在 if 语句中初始化不同类型的对象吗?

Can I initialize object of different types in an if statement?

我知道我会写

if (int a = 1; /* whatever */) {}

甚至

if (int a = 1, b{3}; /* whatever */) {}

但是我如何声明类型为 inta 和类型为 std::stringb

这样的事情不行:

if (auto a = 1, b{"ciaos"s}; /* whatever */) {}

我没有包含标准,因为我对一般的答案很感兴趣,尽管实际上我会在 .

的上下文中使用答案

而且,如果这样的事情不可能发生,是否有任何确切的原因(因此 )?

一个if语句中只能有一个变量声明语句,每个变量声明语句只能声明一个类型。这在 [stmt.if]/3 中有所体现,其中显示了您尝试使用的 if 语句的语法 is

if constexpr(opt) ( init-statement condition ) statement

init-statement can be a simple-declaration and that contains a init-declarator-list which only allows a single declarator。通常这意味着只有一个类型,但是指针 (*) 和引用 (&) 应用于变量名称,而不是类型名称,因此您可以使用 TT*、and/or T& 在单个 init-declarator-list 中声明的变量,即 int a = 42, *b = &a, &c = a;

作为一种解决方法,您可以利用 structured bindings and CTAD (to reduce verbosity) in conjunction with std::tuple 来获得类似

的语法
int main()
{
    using namespace std::string_literals;
    if (auto [a, b] = std::tuple{42, "string"s}; a)
    {
        std::cout << b;
    }
}

输出

string