在C++23中,我们有显式类型转换auto ( expression )
,根据cppreference,它已经被GCC和Clang支持。
我有一个问题,由于某种原因,这种转换不会发生。考虑程序:
// OK, x = 0
int x(int(auto(0)));
// OK, f is function template
int f(auto(x));
// error
int y(int(auto(x)));
字符串
这里接受x
声明,但不接受非常类似的y
声明。在线演示:https://godbolt.org/z/f9zor3eTv
GCC:
error: 'auto' parameter not permitted in this context
型
锵!
error: 'auto' not allowed in function prototype that is not a function declaration
型y
的声明真的非法吗?编译器拒绝它是正确的吗?
1条答案
按热度按时间zz2j4svz1#
如果你有一个类型而不是
auto
,它会读起来像:字符串
但是,不能用
auto
代替long
。[dcl.fct]p22:
[dcl.spec.auto.general]p2
形式为 type-constraintopt
auto
的 * 占位符类型说明符 * 可以用作函数声明或 * parameter-declaration * 的 decl-specifier-seq 的 * decl-specifier*,如果不是auto
* 类型说明符 *,则引入 trailing-return-type(见下文),是函数声明或 * 泛型表达式 * 的 * 泛型参数类型占位符 *。.所以
auto
只能是直接在类型decl-specifier-seq
中的decl-specifier
,而不能进一步嵌套。基本上,如果你能把auto
一直移到左边,它就能工作。因此,这些缩写的函数模板可以工作:
型
而这些不会:
型
同样的限制也适用于初始化器中的占位符类型,比如
auto x = ...;
:型