不寻常的 static_cast 语法

Unusual static_cast syntax

我设法追踪到以下表达式的错误:

foo(static_cast<T>(a, b)); // Executes specialisation 1

右括号位置错误。正确的说法应该是:

foo(static_cast<T>(a), b); // Executes specialisation 2

我从未见过 static_cast 与形式 (a,b) 一起使用,也从未在任何地方见过它的描述。这是什么意思?前一条语句返回 b.

这与static_cast无关,而是comma operator的"makes use"。它的结果是它的右边,所以

foo(static_cast<T>(a, b));

等同于

foo(static_cast<T>(b));

除非a有其他效果(然后会被执行并丢弃它们的结果)。使用正确的编译器设置,您将收到以下警告:Live

static_cast 不是函数,它是关键字,所以 a, b 中的逗号不是参数分隔符;它是 comma operator。它评估 a 但丢弃结果。表达式的计算结果为 b.

, 是逗号运算符,所以 a, b 就是 b