标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
What does the standard say about this pointer-to-member-function type template parameter? Is my code wrong, or is MSVS 16.6 buggy?
以下是一些适用于GCC,Clang和MSVS的代码(至少是编译器资源管理器上当前可用的版本(:
template <typename T, auto T::* MemberPtr>
struct Foo
{
Foo(const T& e) : _e(e) {}
void operator()() const
{
(_e.*MemberPtr)();
}
private:
const T& _e;
};
struct Bar
{
void baz() const {}
auto bind()
{
using BindingType = Foo<Bar, &Bar::baz>;
return BindingType(*this);
}
};
int main()
{
Bar i;
i.bind();
}
但是,从 v16.6.1 开始,MSVS 拒绝它:
Severity Code Description Line
Error C2973 'Foo': invalid template argument 'int' 23
Error E2886 cannot deduce 'auto' template parameter type "auto T::*" from "void (Bar::*)()" 21
Error C2440 'specialization': cannot convert from 'overloaded-function' to 'auto Bar::* ' 22
Error C3535 cannot deduce type for 'auto Bar::* ' from 'int' 23
Error C2440 'specialization': cannot convert from 'int' to 'int Bar::* ' 23
代码可以通过去掉MemberPtr
的T::*
限定符来"修复"该版本中;因此:
template <typename T, auto MemberPtr>
标准对此有何规定?VS v16.6.1 是引入了新的回归,还是现在诊断总是微妙地破坏的代码?
参数/参数组合按原样有效
[温度参数]
4 非类型模板参数应具有以下其中一项 (可选符合 CV 标准(类型:
- 。
- 包含占位符类型的类型。
[temp.arg.nontype]
1 如果模板参数的类型包含占位符 类型,推导的参数类型由 按占位符类型推断的模板参数。如果推导 模板参数声明不允许使用参数类型 ([temp.param](,程序格式不正确。
现在,auto T::*
是包含占位符类型的类型。并且 placholder 类型推导在表单中的变量声明中工作得很好
auto Bar::* foo = &Bar::baz;
所以VS v16.6.1没有拒绝这种非类型模板参数的业务。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 0-1背包代码中的错误.我的代码中有什么错误
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 在我的代码中,获得最大的Pair Wise产品C++和输出并不总是正确的
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 无法在我的堆排序代码中找到错误.无法正确执行.C++
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- 我的代码运行良好,但在游戏循环中中断
- 8谜题代码.我的队列没有填充,我找不到错误的位置