- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码在 c++17 模式下使用 clang-trunk 编译得很好,但在 c++2a(即将推出的 c++20)模式下会中断:
// Meta struct describing the result of a comparison
struct Meta {};
struct Foo {
Meta operator==(const Foo&) {return Meta{};}
Meta operator!=(const Foo&) {return Meta{};}
};
int main()
{
Meta res = (Foo{} != Foo{});
}
-std=c++2a
的错误:
<source>:12:19: error: use of overloaded operator '!=' is ambiguous (with operand types 'Foo' and 'Foo')
Meta res = (f != g);
~ ^ ~
<source>:6:10: note: candidate function
Meta operator!=(const Foo&) {return Meta{};}
^
<source>:5:10: note: candidate function
Meta operator==(const Foo&) {return Meta{};}
^
<source>:5:10: note: candidate function (with reversed parameter order)
operator==
并且编译器会自动生成
operator!=
通过否定
operator==
的结果.据我了解,这仅在返回类型为
bool
时才有效。 .
==
,
!=
,
<
, ... 之间
Array
对象或
Array
和标量,它们返回(的表达式)
bool
的数组(然后可以按元素访问,或以其他方式使用)。例如。,
#include <Eigen/Core>
int main()
{
Eigen::ArrayXd a(10);
a.setRandom();
return (a != 0.0).any();
}
最佳答案
是的,代码实际上在 C++20 中中断了。
表达式 Foo{} != Foo{}
在 C++20 中有三个候选者(而在 C++17 中只有一个):
Meta operator!=(Foo& /*this*/, const Foo&); // #1
Meta operator==(Foo& /*this*/, const Foo&); // #2
Meta operator==(const Foo&, Foo& /*this*/); // #3 - which is #2 reversed
这来自
[over.match.oper]/3.4 中重写的新候选规则。 .所有这些候选人都是可行的,因为我们的
Foo
参数不是
const
.为了找到最可行的候选人,我们必须通过我们的决胜局。
Given these definitions, a viable function
F1
is defined to be a better function than another viable functionF2
if for all argumentsi
,ICSi(F1)
is not a worse conversion sequence thanICSi(F2)
, and then
- [... lots of irrelevant cases for this example ...] or, if not that, then
- F2 is a rewritten candidate ([over.match.oper]) and F1 is not
- F1 and F2 are rewritten candidates, and F2 is a synthesized candidate with reversed order of parameters and F1 is not
#2
和
#3
是重写的候选者,和
#3
参数的顺序颠倒了,而
#1
没有被重写。但是为了达到那个决胜局,我们需要首先通过那个初始条件:对于所有参数,转换序列并不差。
#1
优于
#2
因为所有的转换序列都是一样的(简单来说,因为函数参数是一样的)和
#2
是重写的候选者,而
#1
不是。
#1
/
#3
和
#2
/
#3
卡在第一个条件上。在这两种情况下,第一个参数对于
#1
都有更好的转换顺序。/
#2
而第二个参数对于
#3
有更好的转换顺序(参数
const
必须经过额外的
const
限定,因此它的转换顺序更差)。此
const
触发器使我们无法偏爱任何一个。
As far as I understand, this only works as long as the return type is
bool
.
If a rewritten
operator==
candidate is selected by overload resolution for an operator@
, its return type shall be cvbool
operator==
例如,返回
Meta
- 结果与删除该候选人基本相同。
Meta
的事实无关紧要 - 如果返回
bool
,问题也会存在.
struct Foo {
Meta operator==(const Foo&) const;
Meta operator!=(const Foo&) const;
// ^^^^^^
};
一旦你同时使用了两个比较运算符
const
,不再有歧义。所有参数都相同,因此所有转换序列几乎相同。
#1
现在将击败
#3
by not by 重写和
#2
现在将击败
#3
通过不被逆转 - 这使得
#1
最佳可行人选。与我们在 C++17 中的结果相同,只需多走几步即可实现。
关于c++ - 使用非 bool 返回值重载相等比较时,C++20 中的重大变化或 clang-trunk/gcc-trunk 中的回归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60568088/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!