我可以在 if 语句中初始化不同类型的对象吗?
Can I initialize object of different types in an if statement?
我知道我会写
if (int a = 1; /* whatever */) {}
甚至
if (int a = 1, b{3}; /* whatever */) {}
但是我如何声明类型为 int
的 a
和类型为 std::string
的 b
?
这样的事情不行:
if (auto a = 1, b{"ciaos"s}; /* whatever */) {}
我没有包含标准,因为我对一般的答案很感兴趣,尽管实际上我会在 c++17.
的上下文中使用答案
而且,如果这样的事情不可能发生,是否有任何确切的原因(因此 language-lawyer)?
一个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
。通常这意味着只有一个类型,但是指针 (*) 和引用 (&) 应用于变量名称,而不是类型名称,因此您可以使用 T
、T*
、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
我知道我会写
if (int a = 1; /* whatever */) {}
甚至
if (int a = 1, b{3}; /* whatever */) {}
但是我如何声明类型为 int
的 a
和类型为 std::string
的 b
?
这样的事情不行:
if (auto a = 1, b{"ciaos"s}; /* whatever */) {}
我没有包含标准,因为我对一般的答案很感兴趣,尽管实际上我会在 c++17.
的上下文中使用答案而且,如果这样的事情不可能发生,是否有任何确切的原因(因此 language-lawyer)?
一个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
。通常这意味着只有一个类型,但是指针 (*) 和引用 (&) 应用于变量名称,而不是类型名称,因此您可以使用 T
、T*
、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