Initializer Lists and the Right-Hand Side of Operators
Initializer lists are a convenient way to initialize variables and objects, but their use is restricted on the right-hand side of operators. This can be puzzling, as it seems logical to allow initializer lists in such contexts.
Reasons for the Restriction
According to the C standard, initializer lists are not considered expressions. As arguments to operators generally require expressions, pure initializer lists are prohibited.
Exceptions
There are a few exceptions that allow initializer lists to be used:
Rationale
The C 11 standard committee decided not to allow initializer lists on the left-hand side of operators to simplify parser implementation. Allowing them on the right-hand side would have been too inconsistent without also allowing them on the left-hand side.
Alternatives
Fortunately, there are alternatives to using initializer lists on the right-hand side of operators. One option is to wrap the initializer list in parentheses, which transforms it into an rvalue reference expression:
baz << (std::initializer_list<int>{1, -2, "foo", 4, 5});
Another option is to create a temporary variable of the appropriate type and initialize it with the initializer list:
auto data = bar{1, -2, "foo", 4, 5}; baz << data;
While these alternatives may not be as convenient as using initializer lists directly, they provide a workaround for the restriction on the right-hand side of operators.
The above is the detailed content of Why Can't Initializer Lists Be Directly Used on the Right-Hand Side of C Operators?. For more information, please follow other related articles on the PHP Chinese website!