- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(以下所有ISO标准引用均引用N4659: March 2017 post-Kona working draft/C++17 DIS,并且所有示例程序结果在GCC和Clang上对于C++ 11,C++ 14和C++ 17都是一致的)
考虑以下示例:
#include <initializer_list>
// Denote as A.
void f(float) {}
// Denote as B.
void f(std::initializer_list<int>) {}
int main() {
// Denote call as C1.
f(1.5F); // Overload resolution picks A (trivial).
// Denote call as C2.
f({1.5F}); // Overload resolution picks B (and subsequently fails; narrowing).
return 0;
}
error: type 'float' cannot be narrowed to 'int' in initializer list [-Wc++11-narrowing]
f({1.5F});
函数调用发现void f(std::initializer_list<int>)
是唯一的最佳可行函数,其排名比void f(float)
更好? Afaics这与[over.ics.list]/4和[over.ics.list]/9冲突(请参阅下面的详细信息)。 std::initializer_list<>
(以及有关此主题的各种SO问题)的重载解析的特殊规则,其中,
std::initializer_list<>
是首选,由
[over.match.list]/1来控制。但是,狂热,这在这里不适用(或者,如果我错了,至少可以说与
[over.ics.list]/4中显示的标准示例有冲突)。
candidate_functions(C1) = { void f(float),
void f(std::initializer_list<int>) }
candidate_functions(C2) = { void f(float),
void f(std::initializer_list<int>) }
viable_functions(C1) = { void f(float),
void f(std::initializer_list<int>) }
viable_functions(C2) = { void f(float),
void f(std::initializer_list<int>) }
f(1.5F)
具有身份标准转换(不转换),因此可以(平分和明确地)选择A的精确匹配项(按照
[over.ics.scs]/3)作为最佳可行函数。
best_viable_function(C1) = void f(float)
f({1.5F})
的隐式转换序列对可行候选者进行排名由
[over.ics.list]/1控制:
When an argument is an initializer list ([dcl.init.list]), it is not an expression and special rules apply for converting it to a parameter type.
float
类型的A的匹配,可应用
[over.ics.list]/9,尤其是
[over.ics.list]/9.1 [
强调矿]:
Otherwise, if the parameter type is not a class:
(9.1) if the initializer list has one element that is not itself an initializer list, the implicit conversion sequence is the one required to convert the element to the parameter type; [ Example:
void f(int);
f( {'a'} ); // OK: same conversion as char to int
f( {1.0} ); // error: narrowing— end example ]
[...]
f({1.5F}}
匹配到
f(float)
的隐式转换序列与
float
到
float
的转换序列相同;即身份转换以及随后的完全匹配。但是,按照上面的示例,由于调用C2甚至不会导致模棱两可的最佳可行函数,因此我的逻辑中肯定存在一些缺陷。
Otherwise, if the parameter type is
std::initializer_list<X>
and all the elements of the initializer list can be implicitly converted toX
, the implicit conversion sequence is the worst conversion necessary to convert an element of the list toX
, or if the initializer list has no elements, the identity conversion. This conversion can be a user-defined conversion even in the context of a call to an initializer-list constructor. [ Example:void f(std::initializer_list<int>);
f( {} ); // OK: f(initializer_list<int>) identity conversion
f( {1,2,3} ); // OK: f(initializer_list<int>) identity conversion
f( {'a','b'} ); // OK: f(initializer_list<int>) integral promotion
f( {1.0} ); // error: narrowing
[...]— end example ]
float
元素转换为
int
所需的最差转换,这是一个转换排序的标准转换序列(
[over.ics.scs]/3),尤其是按照
[conv.fpint]/1变窄的转换。
best_viable_function(C2) = void f(float) ?
最佳答案
列表初始化序列:一种序列转换为std::initializer_list
时的特殊情况排序
[over.ics.rank]/3.1适用于这种情况,并且优先于[over.ics.rank]/3的其他规则[强调矿]:
List-initialization sequence
L1
is a better conversion sequence than list-initialization sequenceL2
if
- (3.1.1)
L1
converts tostd::initializer_list<X>
for someX
andL2
does not, or, if not that- (3.1.2) [...]
even if one of the other rules in this paragraph would otherwise apply. [ Example:
void f1(int); // #1
void f1(std::initializer_list<long>); // #2
void g1() { f1({42}); } // chooses #2
void f2(std::pair<const char*, const char*>); // #3
void f2(std::initializer_list<std::string>); // #4
void g2() { f2({"foo","bar"}); } // chooses #4— end example ]
f({1.5F});
调用实际上具有含糊的排名规则。最佳可行的功能,已包含在
CWG Defect Report 1589 [
强调我的]中:
1589. Ambiguous ranking of list-initialization sequences
Section: 16.3.3.2 [over.ics.rank]
Status: CD4
Submitter: Johannes Schaub
Date: 2012-11-21[Moved to DR at the November, 2014 meeting.]
The interpretation of the following example is unclear in the current wording:
void f(long);
void f(initializer_list<int>);
int main() { f({1L});The problem is that a list-initialization sequence can also be a standard conversion sequence, depending on the types of the elements and the type of the parameter, so more than one bullet in the list in 16.3.3.2 [over.ics.rank] paragraph 3 applies:
[...]
对于上面的示例,这些项目符号给出相反的结果,
是在其中选择的实现差异。
[...]
拟议的解决方案(2014年6月):
此问题已通过解决问题得到解决
1467。
CWG Defect Report 1467最终还解决了DR 1589,特别是在[ 强调矿]的上方添加了[over.ics.rank] / 3中引用的相关部分:
1467. List-initialization of aggregate from same-type object
[...]
Proposed resolution (June, 2014):
[...]
- Move the final bullet of 16.3.3.2 [over.ics.rank] paragraph 3 to the beginning of the list and change it as follows:
[...]
even if one of the other rules in this paragraph would otherwise apply. [Example: ... — end example]
This resolution also resolves issues 1490, 1589, 1631, 1756, and 1758.
此后,诸如GCC和Clang之类的编译器已将DR 1467向后移植到较早的标准(C++ 11和C++ 14)。
关于c++ - 使用std::initializer_list参数的非成员函数(/非构造函数上下文)的重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62302073/
在 Windows 世界中,什么是正确的名称。具有导出函数的老式 C++ DLL?不是 COM DLL,也不是 .NET DLL。我们以前通过调用 LoadLibrary() 和 GetProcAdd
目前我正在使用javaEE7,我有一个场景如下。在我的 JSF Web 应用程序中,我有一个事件监听器(不是 JSF 事件),当事件调用时,它会执行某些操作,然后将这些信息更新到我的 Web 应用程序
这不是 AJAX 请求/响应回调问题... 我正在使用 Dojo 1.5 构建网格。我正在尝试 dojo.connect具有功能的扩展/收缩按钮。我的问题是 grid.startup()在创建实际 D
非 Webkit Opera 是 very specific在某些功能中,因此通常通过 JavaScript 检测到 the following way . 但是,Opera Next 几乎是 Goo
我已查看以下链接中给出的所有日志,但未能找到 IP 地址: https://developer.couchbase.com/documentation/server/3.x/admin/Misc/Tr
我有一个命令行程序,它根据一组源文件生成一个我想在我的 Android gradle 构建 (A) 中使用的 jar 文件。这个命令行程序只是将一个 jar 文件存储在磁盘上的一个目录中。 我如何创建
下面的 htaccess 命令将所有非 www 转移到 http www RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. RewriteRule ^
我正在使用自定义链接器脚本将内核镜像分为两部分。第一个是普通代码和数据,第二个是初始化代码和不再需要时将被丢弃的数据。初始化部分也不像内核本身那样在地址空间之间共享,因此如果 fork() 仍然存在(
这个问题在这里已经有了答案: Several unary operators in C and C++ (3 个答案) What is the "-->" operator in C++? (29
假设我有一个类设置如下: class A { public: virtual void foo() { printf("default implementation\n"); } }; c
#include using namespace std; int main(int argc, char *argv[]) { int i=-5; while(~(i)) {
近期,百度搜索引擎变化无常,很多企业站、行业站、门户站、论坛等站点遭到了降权,特别是比比贴分类信息网直接遭到了拔毛,这对于广大站长来说是一种打击,也是各个企业、行业的打击。 至今,很多网站已经恢复
我现在正在使用 IBM TPM v1332 + IBM TSS v1470 并尝试将一些基本关键字/密码存储到 TPM 上的非 volatile 内存中。我找到了两种方法。一种是创建一个密封对象并使用
我的 PHP 脚本中有一个正则表达式,如下所示: /(\b$term|$term\b)(?!([^)/iu 这与 $term 中包含的单词匹配,只要前后有单词边界并且它不在 HTML 标记内即可。 但
我想显示用户名称地址(请参阅 www.ipchicken.com ),但我唯一能找到的是 IP 地址。我尝试了反向查找,但也没有用: IPAddress ip = IPAddress.Parse(th
只有 UI 线程能够显示到屏幕上,还是其他线程也可以这样做? 最佳答案 不,您只能直接从 UI 线程访问 UI,但您可以编码来自其他线程的结果,例如使用 Control.Invoke 或 contro
我正在使用现代 Excel 滚动条(不是旧的 ActiveX 类型,即开发人员 > 插入 > 表单控件 > 滚动条)并且想检测它的值何时更改。我找不到有关此类对象的更改事件的任何信息。您可以在单击时分
当我使用这段代码时 IE 6 确实正确使用了指定的样式表,但所有其他浏览器在应该使用基本上声明的样式表时会忽略这两种样式表,如果您不是 IE,请使用此样式表。 有什么想法吗? 最佳答案 n
我想指定 2 mssql 表之间的关系。 付款类别和付款。 paymentcategory.id 加入 payout.category 列。 在 payout.json 模型中 我指定为外键:id,
我正在尝试制作非 volatile UDF,但似乎不可能。因此,这是我非常简单的test-UDF: Option Explicit Dim i As Integer Sub Main() i = 0
我是一名优秀的程序员,十分优秀!