- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
[conv]/4 :
Certain language constructs require that an expression be converted to a Boolean value. An expression
e
appearing in such a context is said to be contextually converted tobool
and is well-formed if and only if the declarationbool t(e);
is well-formed, for some invented temporary variablet
(11.6).
现在考虑下面的片段。它不编译,也不在 clang 中, GCC或 VS .
struct A{ bool operator!() { return true; } };
int main(){
A a;
bool t(a);
}
因此,从 [conv]/4 我们得出结论,A
类型未根据上下文转换为 bool
。
The operand of the logical negation operator
!
is contextually converted tobool
(Clause 7); its value istrue
if the converted operand isfalse
andfalse
otherwise. The type of the result isbool
.
我对上面段落的理解是,逻辑否定运算符 !
的操作数必须根据上下文转换为 bool
。我们刚刚得出结论,A
类型未根据上下文转换为bool
。因此,从 [expr.unary.op]/9,我们可以说下面的代码应该不编译。但确实如此,在 clang 中, GCC和 VS .
struct A{ bool operator!() { return true; } };
int main(){
A a;
bool t = !a;
}
我错过了什么?
最佳答案
[expr]整体适用于内置运算符:
Clause [expr] defines the effects of operators when applied to types for which they have not been overloaded.
[expr.unary.op] 中的定义只是内置运算符的定义!
。此外,[over.match.oper]描述了如何查找重载运算符:
For a unary operator @ with an operand of a type whose cv-unqualified version is T1, [...], three sets of candidate functions, designated member candidates, non-member candidates and built-in candidates, are constructed as follows: [...]
对于 !a
,您有两个候选者:您的重载 A::operator!()
和 [over.built] 中定义的内置函数:
There also exist candidate operator functions of the form
bool operator!(bool);
对于通过重载决议选择的内置函数,类型必须根据上下文转换为 bool
† 正如您的论点所建议的那样。然而,这个候选者是不可行的——但是重载的成员运算符是可行的。
† T.C.像往常一样在它上面,指出cwg issue 1919这表明 可以根据上下文转换为 bool
的类型仍然不应该使用内置的 operator!
因为措辞问题。尽管 gcc 和 clang 都允许它(这可能是我们所有人都希望发生的事情)。
关于c++ - [expr.unary.op]/9 似乎暗示 `operator !()` 不能应用于下面的类型 A。但编译器不同意这一点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44679200/
我需要在我的网站中实现自动建议功能,并且我需要一些易于开发或编辑的 java 脚本框架或代码,并且自动建议将是多个字段 最佳答案 适配 jQuery:http://jqueryui.com/ 关于ja
在下面的示例中,SonarQube 提示 model.toString() 是 not null 并且 (model == null) 始终 false,需要一些帮助来了解可以采取哪些措施来修复它。因
我正在尝试创建自定义 iOS 键盘。我使用 UILexicon 类来提供 requestSupplementaryLexiconWithCompletion: 方法提供的基本词库。 但我也想将预测文本
如何断言如果 X 为 true 那么 Y 也为 true。问题是,如果我写以下内容: assert(X && Y && "If X is true then Y should be true too.
创建路径中包含两个反斜杠的文件时,是否会产生任何不可预见的后果。 在此代码中,文件创建正常,但我想知道在使用此文件的过程中是否有任何副作用。 HANDLE hFile = CreateFile(
在下面的示例中,SonarQube 提示 bookmark 可能为 null 或为 null,需要一些帮助来了解可以采取哪些措施来修复它。因为 bookmark 在 for 循环中被初始化为变量,并且
这个问题在这里已经有了答案: Partial ordered Comparator (6 个答案) 关闭 8 年前。 我有一组序列化到文件中的项目。有些项目可以依赖其他项目,但不允许循环引用。因此,
我想创建将始终使用 gcc/g++/clang 支持的 C/C++ 标准的“最新”版本的 shell 别名/clang++(C的一个别名,C++的一个别名)。我意识到这可能有多种解释: 最新的 GNU
我是一名优秀的程序员,十分优秀!