提问人:Fedor 提问时间:11/12/2023 更新时间:11/12/2023 访问量:85
直接初始化参数中的 auto ( expression )
auto ( expression ) in direct initialization argument
问:
在 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/f9zor3eTvx
y
海湾合作委员会:
error: 'auto' parameter not permitted in this context
铛:
error: 'auto' not allowed in function prototype that is not a function declaration
声明真的是非法的,编译器拒绝它是正确的吗?y
答:
1赞
Artyer
11/12/2023
#1
如果你有一个类型而不是 ,它会读成:auto
int y(int(long(x)));
// ->
int y(int(long x));
// ->
int y(int(*)(long));
但是,您不能将 .auto
long
缩写函数模板是具有一个或多个泛型参数类型占位符 ([dcl.spec.auto]) 的函数声明。[...]
type-constraintopt 形式的占位符类型说明符可以用作函数声明或 lambda 表达式的参数声明的 decl-specifier-seq 的 decl-specifier,如果它不是引入尾随返回类型的类型说明符(见下文),则是函数声明或 lambda-expression 的泛型参数类型占位符。
auto
auto
...所以只能是直接在类型中的类型,不能进一步嵌套。基本上,如果你能一直向左移动,它就会起作用。auto
decl-specifier
decl-specifier-seq
auto
因此,这些缩写的函数模板可以工作:
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
评论
y
template <typename T>int y(int(*)(T));
{..}
int y{int(auto(x))};
type_name identifier{};
identifier
type_name
y
x
int
auto
{}
(..)