为什么在 ctor 的参数列表中将成员"x"的类型替换为"decltype(x)"会破坏类模板参数推导?
Why does replacing the type of the member `x` with `decltype(x)` in a ctor's argument list break class template argument deduction?
我正试图编写某种预处理器怪物来制作简单的actor。
这与g++ -std=c++17
:一起编译
template<typename T>
struct foo{
T x;
foo(T _x):x(_x){}
};
auto x=foo(3);
但怪物很难知道x
的类型,所以我尝试了这个:
template<typename T>
struct foo{
T x;
foo(decltype(x) _x):x(_x){}
};
auto x=foo(3);
失败(class template argument deduction failed
(。但无论如何,decltype(x)
就是T
,对吧?那么,为什么代码示例不等价呢?
您所写的是一种循环逻辑。这样想吧。
编译器看到foo(3)
。foo
命名了一个类模板,因此它试图执行类模板参数推导,以找出foo
中的T
应该是什么
CTAD一开始就去掉了所有的构造函数和构建模板推导指南。你有一个构造函数,所以它的指南必须看起来像:
template<typename T> foo(decltype(foo<T>::x) _x) -> foo<T>;
为了推导foo
的模板参数T
,您需要实例化foo
。。。具有CCD_ 13。你还没有,因为弄清楚T
是什么是你最初构建这个推导指南的原因。
这里的简短答案是因为C++标准是这么说的。decltype
表达式不能作为模板参数推导出来。
17.8.2.5从类型〔temp.decture.type〕中推导模板参数
未推导的上下文为:
[…]
--decltype说明符的表达式。
您正在使用C++17。如果你使用decltype
来隐藏一些怪物,你可能需要使用C++17的推导指南来解决它
相关文章:
- 模板参数替换失败,并且未完成隐式转换
- 如果可推导类型上有替换,可变参数模板类型推导会使编译器崩溃
- 将变量替换为可变参数模板
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 类似函数的宏参数名称替换是否保证永远不会发生?
- 模板参数推导/替换失败,lambda作为函数指针
- 为什么在 ctor 的参数列表中将成员"x"的类型替换为"decltype(x)"会破坏类模板参数推导?
- 为什么我的一个宏参数被替换为')'而不是标识符?
- 类模板参数推导失败会导致替换失败
- 使用"std::function"和先前推断的模板参数替换失败 - 为什么?
- 不能将模板参数替换为类型模板参数_Ty
- 模板参数替换令人惊讶?
- 将默认模板参数替换为别名
- 有没有办法用参数替换字符串,例如 C++ 中的 printf
- 要求子句是在声明中的参数替换后计算的
- 为什么模板参数替换的顺序很重要
- 依赖模板名称参数替换
- 模板默认参数替换失败 clang 3.3.
- 参数替换的C++规则