直接初始化参数中的 auto ( expression )

auto ( expression ) in direct initialization argument

提问人:Fedor 提问时间:11/12/2023 更新时间:11/12/2023 访问量:85

问:

在 C++23 中,我们有显式类型转换,并且根据 cppreference 它已经被 GCC 和 Clang 支持。auto ( expression )

我有一个问题,由于某种原因没有发生这种投射。考虑以下程序:

// OK, x = 0
int x(int(auto(0)));

// OK, f is function template
int f(auto(x));

// error
int y(int(auto(x)));

这里接受声明,但非常相似的声明不被接受。在线演示:https://godbolt.org/z/f9zor3eTvxy

海湾合作委员会:

error: 'auto' parameter not permitted in this context

铛:

error: 'auto' not allowed in function prototype that is not a function declaration

声明真的是非法的,编译器拒绝它是正确的吗?y

++ 强制转换 语言-律师 自动 C++23

评论

0赞 Jarod42 11/12/2023
我会阅读为函数模板,即使用作品演示ytemplate <typename T>int y(int(*)(T));{..}int y{int(auto(x))};
1赞 Nicol Bolas 11/12/2023
@Jarod42:这不是一个函数模板。它只是一个常规变量声明。任何形式的内容都声明了 类型的变量。整数具有函数指针的值,转换为 .请记住:只在函数声明中获得特殊权限,从不声明函数。type_name identifier{};identifiertype_nameyxintauto{}
0赞 Jarod42 11/12/2023
@NicolBolas:令人烦恼的解析,给出的答案与我的方向相同......(..)

答:

1赞 Artyer 11/12/2023 #1

如果你有一个类型而不是 ,它会读成:auto

int y(int(long(x)));
// ->
int y(int(long x));
// ->
int y(int(*)(long));

但是,您不能将 .autolong

[dcl.fct]p22

缩写函数模板是具有一个或多个泛型参数类型占位符 ([dcl.spec.auto]) 的函数声明。[...]

[dcl.spec.auto.general]p2

type-constraintopt 形式的占位符类型说明符可以用作函数声明或 lambda 表达式的参数声明的 decl-specifier-seq 的 decl-specifier,如果它不是引入尾随返回类型的类型说明符(见下文),则是函数声明lambda-expression泛型参数类型占位符 autoauto

...所以只能是直接在类型中的类型,不能进一步嵌套。基本上,如果你能一直向左移动,它就会起作用。autodecl-specifierdecl-specifier-seqauto

因此,这些缩写的函数模板可以工作:

int y(auto x);
int y(auto* x);
int y(auto const*& x);
int y(const auto*& x);
int y(auto* x[][12]);
int y(auto (*x)[3][4]);
int y(auto (*fn)(int x));
// Last one can be written as:
int y(auto(int x));
int y(auto(int(x)));

而这些不会:

int y(std::vector<auto> x);
int y(void (*fn)(auto));
int y(int x[sizeof(auto)]);

完全相同的限制适用于初始值设定项中的占位符类型,例如:auto x = ...;

int f(int);

auto (*ptr1)(int) = f;  // Works
// int (*ptr2)(auto) = f;  // Doesn't