- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Otherwise, if
E1.E2
refers to a non-static member function and the type ofE2
is “function of parameter-type-list cv ref-qualifieropt returning T”, thenE1.E2
is a prvalue. The expression designates a non-static member function. The expression can be used only as the left-hand operand of a member function call ([class.mfct]). [ Note: Any redundant set of parentheses surrounding the expression is ignored ([expr.prim.paren]). — end note ] The type ofE1.E2
is “function of parameter-type-list cv returningT
”.
main
中的第二个语句下面没有编译,可能是因为上面突出显示的句子。但是为什么语言被设置为以这种方式工作?
#include<iostream>
void g();
struct S { void f(); };
S s;
int main(){
std::cout << "decltype(g) == void() ? " << std::is_same<decltype(g), void()>::value << '\n'; // Ok
std::cout << "decltype(s.f) == void() ? " << std::is_same<decltype(s.f), void()>::value << '\n'; // Doesn't compile probably because of the sentence hihlighted above in [expr.ref]p(6.3.2).
}
最佳答案
当您这样做时E1.E2
,您不是在谈论 E1
类型的事物的一般属性是。您要求访问由 E1
指定的对象内的事物。 ,其中要访问的事物的名称是E2
.如 E2
是静态的,它访问类静态的东西;如果 E2
是非静态的,然后它访问特定于该对象的成员事物。这很重要。
成员变量成为子对象。如果您的类(class) S
有一个非静态数据成员 int i;
, s.i
是对 int
的引用.从 int&
的角度来看,该引用文献, 的行为与任何其他 int&
没有什么不同.
让我更清楚地说:任何 int*
或 int&
可以指向/引用 int
这是一个完整的对象或 int
它是某个其他对象的子对象。单个构造 int&
可以以这种方式履行双重职责。 *
鉴于对s.i
的理解,s.f
的假定含义是什么? ?嗯,应该差不多吧? s.f
当用 params
调用时会是某种东西, 相当于做 s.f(params)
.
但这不是 C++ 中存在的东西。
C++ 中没有语言结构可以表示 s.f
的含义。 .这样的构造需要存储对 s
的引用。以及成员(member)S::f
.
函数指针不能这样做。函数指针需要能够与 void*
指针相互转换**。但是这样的s.f
将需要存储成员 S::f
以及对 s
的引用本身。所以根据定义,它必须大于 void*
.
成员指针也不能这样做。成员指针明确不携带它们的 this
对象和他们一起(这就是重点);您必须在调用时使用特定成员指针调用语法提供它们 .*
或 .->
.
哦,有一些方法可以在语言中对此进行编码:lambdas,std::bind
等。但是没有具有这种精确含义的语言级构造。
因为C++在这种方式上是不对称的,其中s.i
具有可编码的意义但不是 s.f
, C++ 使不可编码的非法。
您可能会问为什么这样的构造不能简单地构建。其实没那么重要。由于 s.f
的复杂性,该语言可以正常工作。需要的是,如果这是您想要的,最好让您使用 lambda(无可否认,应该有办法缩短编写此类内容的时间)。
如果你想要一个裸体 s.f
相当于 S::f
(即:指定成员函数),这也不起作用。一、S::f
也没有类型;您可以对这样的纯右值做的唯一事情是将其转换为指向成员的指针。其次,成员函数指针不知道它来自哪个对象,所以为了使用一个来调用成员,你需要给它s
.因此,在调用表达式中,s
必须出现两次。这真的很愚蠢。
*:有些事情你可以做来完成对象,而你不能对子对象做。但是那些会引起 UB,因为它们无法被编译器检测到,因为 int*
没有说它是否来自子对象。这是重点;没有人能分辨出其中的区别。
**:标准不要求这样做,但标准不能做一些使这种实现不可能的事情。大多数实现都提供此功能,基本上任何 DLL/SO 加载代码都依赖于它。哦,它也将与 C 完全不兼容,这使得它无法入门。
关于c++ - 为什么 [expr.ref]p(6.3.2) 中的句子 "The expression can be used only as the left-hand operand of a member function call"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56409433/
假设我有一个数据集,每行包含一个句子,该句子来自一个非常大的调查(德语和法语)中的一个开放式问题。大多数句子(答案)是合乎逻辑的;即有意义的单词组合。但是,也有一些粗心的受访者只是简单地填写了各种不合
我的 MySQL 数据库中有一个表,其结构如下: CREATE TABLE `papers` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varch
在新的 Edge 浏览器(基于 chromium)中,有一个文本到语音的选项,在阅读页面时它会突出显示正在阅读的句子和单词,就像这样 - 过去我有一个简单的 Windows TTS 应用程序,我通过将
我有一本书的图像文件。我正在编写一个 Web 应用程序,用于加载书籍并一次显示一页。我想知道如何在页面中选择一个句子并显示一条消息。据我所知,它必须具有图像坐标。 请参阅http://epaper.d
我使用的 GPS 输出多个 NMEA 语句,可用于定位数据。 (GPGGA 和 GPRMC)。有什么理由我应该使用一个而不是另一个吗?我应该检查它们并比较数据吗?我可以随便挑一个使用吗? 在这一点上,
我想使用TinyGPS++在 Arduino 上解析 NMEA 数据并在 OLED 显示屏上显示信息。但是,NMEA 数据将通过 USB 接收,而不是使用软件串行和 TX/RX 引脚。 我按照 Tin
我需要删除其中的所有空格。 例如:这是我的代码O/P:Thisismycode 这是我到目前为止的代码。 import java.util.Scanner; public class nospace{
我对 python 很陌生,我不知道如何解决以下问题: 我有两个数据框,我想使用某种 VLOOKUP 函数来将句子与特定关键字相匹配。在下面的示例中,(df1) 3e 句子应与“banana”(df2
这个问题已经有答案了: How slicing in Python works (38 个回答) Python list slice syntax used for no obvious reason
我想在我的表格作者的句子列中找到以 # 开头的单词。我不知道我在寻找什么词,因为我只知道它以 # 开头。 表:作者(姓名,句子) 作者 |句子 艾伯特 |我#want to be #discussin
句子
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve
我目前正在经历免费代码营的第一个 JS 挑战。 我在标题为“句子首字母大写”的挑战中遇到了问题。在这个挑战中,我需要编写一个函数,将给定字符串中单词的每个第一个字母大写,并将所有其他字母小写。 Her
假设我有一个文本,看起来像这样: Some sentence in which a fox jumps over some fence. Another sentence in which a
我是 C++ 的初学者,我想了解有关字符的更多信息,但我遇到了问题。我试图制作一个程序,它复制一个句子并在空格 (' ') 之间添加一个新行 ('\n'),就像一个单词一个单词地分开一个句子. int
我需要将一个句子(例如“Hello world”)复制到一个字符串列表中,意思是复制到一个字符数组中,其中每 2 个单词由 '\0' 分隔。请注意,单词被定义为一行中没有空格的任意数量的字符。 因此,
我有这样一个字符串, my_str ='·in this match, dated may 1, 2013 (the "the match") is between brooklyn centenni
我在列表中有一堆句子,我想使用 nltk 库来阻止它。我可以一次提取一个句子,但是我在从列表中提取句子并将它们重新组合在一起时遇到了问题。我缺少一个步骤吗? nltk 库很新。谢谢! import n
我有一个词和文本。我必须找到所有包含该词的提案。你有什么想法吗? piblic List GetSnetences(string word) { // search all proposals
我正在通过 doc2vec 模型使用 gensim 库在 Python 中构建 NLP 聊天应用程序。我有硬编码的文档并给出了一组训练示例,我通过抛出用户问题来测试模型,然后第一步找到最相似的文档。在
我有以下代码,每 10 个单词拆分一行。 #!/bin/bash while read line do counter=1; for word in $line do
我是一名优秀的程序员,十分优秀!