- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在C++17 template deduction guide not used for empty parameter set? 之后,在模板推导指南中遇到了另一个怪事(遗憾的是,该错误 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81486 仍未在 GCC 主干中修复 :( ):
#include <utility>
template <class T> struct success
{
T value;
constexpr success(T &&v)
: value(std::move(v))
{
}
constexpr success(const T &v)
: value(v)
{
}
};
template <> struct success<void>
{
};
template <class T> success(T /*unused*/)->success<T>;
success()->success<void>;
template<class T> struct foo
{
foo(success<void>) {}
};
int main(void)
{
auto a = success{5}; // works
auto b = success{}; // works
auto c = success{"hello"}; // works
auto d = success(5); // works
//auto e = success(); // FAILS on GCC 7.2!
auto f = success("hello"); // works
foo<void> g(success()); // FAILS
static_assert(std::is_same<decltype(a), success<int>>::value, "");
static_assert(std::is_same<decltype(b), success<void>>::value, "");
static_assert(std::is_same<decltype(c), success<const char *>>::value, "");
static_assert(std::is_same<decltype(d), success<int>>::value, "");
//static_assert(std::is_same<decltype(e), success<void>>::value, "");
static_assert(std::is_same<decltype(f), success<const char *>>::value, "");
return 0;
}
至少对我来说,令人惊讶的是 foo<void> g(success());
无法在 clang 6.0 trunk 和 GCC 7 trunk 上使用模板推导指南,如您在 https://godbolt.org/g/7m1Zhk 中看到的那样
我发现这令人惊讶,而且出乎人们的意料。模板指南说一个朴素的success()
应构造为 success<void>
.对于接受 success<void>
的 foo 明确的构造函数,这应该可以正常工作.而是 clang 6.0 trunk 报告:
34 : <source>:34:17: error: use of class template 'success' requires template arguments; argument deduction not allowed in function return type
foo<void> g(success()); // FAILS
^~~~~~~
3 : <source>:3:27: note: template is declared here
template <class T> struct success
^
以及 GCC 7.3 主干报告:
<source>: In function 'int main()':
34 : <source>:34:25: error: 'auto' parameter not permitted in this context
foo<void> g(success()); // FAILS
^
谁能解释一下这是怎么回事?这是 C++ 17 标准的缺陷吗?
最佳答案
我相信您遇到了一种新形式的最令人烦恼的解析。
请记住,任何代码段的句法形式都是在名称查找以外的任何语义规则应用于它之前确定的。既然 template-name 在句法上是一个有效的 simple-type-specifier,就可以解析
foo<void> g(success());
作为对象的定义 g
带有初始值设定项或函数声明 g
.根据 Most Vexing Parse 规则,函数解析“获胜”,因此 g
声明一个返回 foo<void>
的函数它的一个未命名参数是一个没有参数的函数,返回占位符类模板类型 success
.
但是当语义检查开始时,这不是类模板占位符类型的有效用法之一,因此程序格式错误。
请注意,如果我们进行一些调整以避免最令人烦恼的解析,clang 将会成功:
foo<void> g2{success()};
struct bar { bar(int, succeed<void>) {} };
bar g3(1, success());
但是,我认为下面的双括号技巧也应该有效,但它只会导致来自 clang 的新错误消息。我不确定这个是怎么回事:
foo<void> g4((success()));
关于C++17 模板推导指南不用于空参数集(ver 2)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46576559/
2011 年 9 月 5 日更新:问题已解决 -- 查看底部的详细信息 我在使用 Aptana Ver 3.0.4 中的 Code Assist 时遇到问题。 Eclipse 3.7.0 的插件。 我
我正在开发 API,它给我 PDF(1.7 版)作为响应,我的项目正在使用不支持解析 PDF 1.7 版的 zend pdf 库。 所以我决定转换 PDF 版本以与 Zend Pdf 兼容。 有什么方
我尝试在 Android Studio 上构建和使用 FFmpeg 库。 我的环境 Windows 7 64 位、Cygwin64、Android Studio 2.1.2、FFmpeg 3.1.1、
假设我有 3 个表:Standard_Code 以及 Report and Transactions。 Standard_Code table field name: Code Values
将查询字符串附加到样式表末尾有什么作用?我经常看到: some-stylesheet.css?ver=1.2.3 谢谢。 最佳答案 通常人们用它来防止缓存 CSS 文件。 服务器软件(例如 Apach
我正在尝试从批处理文件中检查OS版本,并且遇到以下问题。 线 FOR /F "tokens=*" %%i IN ('ver') DO (SET var=%%i) 从批处理文件执行时将冻结cmd,而命令
我试图安装最新的VMWare PowerCLI,但出现错误:Install-Module:术语“Install-Module”未被识别为cmdlet的名称,功能... 一些挖掘显示我没有安装Power
从之前的版本移至 pgadmin4 ver3 后,在查询窗口中编辑文本时,我不再能够看到光标。 我可以突出显示文本,但如果我在文本行内移动任何位置,则光标不会出现。它有时会出现在行尾,但一旦我向左箭头
我只是在寻找一些关于 hibernate 如何使用 ver 列处理冲突的文档。 到目前为止的理解:对一行的更改意味着更改的行插入了新的版本号 -- 这是通过“select max(ver)+1”完成的
在我的 Android 游戏中,子弹出现的速度太快而且彼此距离太近!我怎样才能调整他们的行为?这是 a picture of it 动画对象类 package game.objects.animati
在C++17 template deduction guide not used for empty parameter set? 之后,在模板推导指南中遇到了另一个怪事(遗憾的是,该错误 https
我正在尝试创建一个表,该表将在服务器中使用 phpmyadmin 按年份范围进行分区: mysql Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_6
我想知道版本命名的具体作用是什么? 喜欢 jquery.js?ver=1.4.4 我的意思是如果我使用像这样的 cdn jquery/1.4.4/jquery.min.js?ver=1.4.4但是另一
在 postman 工作(原始格式数据与 application/json 类型)带 Guzzle 6 url-http://vm.xxxxx.com/v1/hirejob/ { "c
我已经在这个问题上工作了 6 个小时,但我似乎看不到它。这是index.html 中的片段: dataArray(总是工作正常): (function() { 'us
我正在尝试在 Google 文档上上传大文件。我遇到了Resumable Upload . 但是我如何在 Google API Ver 2 中实现它呢? 谢谢 最佳答案 根据我在 API 的 V2 和
最近我的团队遇到了一个奇怪的情况。去年年底,我们从 IE 8 迁移到 IE 11。我们的应用程序现在设计为在 IE 11 企业模式下工作。 如果用户使用的是 IE 8,我们需要显示一个 javascr
我的应用程序在 Android 4.0+ 版本上运行良好,但是当我尝试在版本 4.0 上启动它时出现错误。 2.3有什么建议么?android:minSdkVersion="8"android:tar
我最近购买了一个主题,该主题包含以下 HTML 代码; 所以,我想知道?ver=3.7.1的用法是什么。感谢您的帮助。 最佳答案 资源在每个 URL 的基础上被缓存。通过在发布新版本时更改查询字符
我需要在我的事件方法中做两个事件。一个是需要返回 total_workers 字段的值。但也需要返回 ID,因为当我们覆盖该方法时,它在 OpenERP 中是必要的要求。然后必须返回 2 东西。请告诉
我是一名优秀的程序员,十分优秀!