- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
考虑以下程序:
#include <cstddef>
#include <cstdio>
void f(char const*&&) { std::puts("char const*&&"); } // (1)
void f(char const* const&) { std::puts("char const* const&"); } // (2)
template <std::size_t N>
void f(char const (&)[N]) { std::puts("char const(&)[N]"); } // (3)
int main()
{
const char data[] = "a";
f(data);
}
应该调用哪个f
?为什么?
三个编译器的最新发布版本对这个问题的答案存在分歧:
重载决议规则在不同的 C++0x 草案中是否发生了重大变化?或者,这些编译器中的两个真的完全错误吗?根据最新的 C++0x 草案选择哪个重载是正确的重载?
最佳答案
首先,所有三个的转换序列是相同的,除了前两个,有一个左值转换(左值到右值转换),但是在排序转换序列中不使用它。这三个都是完全匹配的(函数模板特化具有参数类型char const(&)[2]
)。
如果您在 13.3.3.2p3
处迭代规则,则在本段停止
S1 and S2 are reference bindings (8.5.3) and neither refers to an implicit object parameter of a non-static member function declared without a ref-qualifier, and S1 binds an rvalue reference to an rvalue and S2 binds an lvalue reference.
如果需要将右值引用绑定(bind)到左值,则无法形成转换序列,规范在 13.3.3.1.4p3 中说。如果您查看 8.5.3p5 最后一个项目符号的引用绑定(bind)是如何工作的,它将从数组中创建一个 char const*
类型的临时(我认为他们的意思是 rvalue 临时)左值并将引用绑定(bind)到该临时文件。因此,我认为(1)
优于(2)
。 (1)
对 (3)
也一样,虽然我们不需要这个,因为 (3)
是一个模板,所以可以打成平手,我们会再次选择(1)
。
在 n3225
中,他们更改了引用绑定(bind)规则,以便右值引用可以绑定(bind)到作为左值的初始化表达式,只要该引用将绑定(bind)到右值(可能通过转换初始化程序来创建)之前正确)。这可能会影响 Visual C++ 的处理,此处可能不是最新的。
我不确定clang。即使它会忽略 (1)
,它也会在 (2)
和 (3)
之间打成平手,并且需要选择 (2)
因为它不是模板。
我认为 8.5.3p5 的最后一个项目符号令人困惑,因为它说“否则为临时类型......”。目前尚不清楚临时值是被 13.3.3.1.4p3 视为左值还是右值,这意味着我不确定根据规范的确切文字,以下内容应该如何真正表现
void f(int &);
void f(int &&);
int main() {
int n = 0;
f(n);
}
如果我们假设第 13 条将临时值视为右值,那么我们将右值 ref 绑定(bind)到第二个函数中的右值和第一个函数中的左值。因此,我们将选择第二个函数,然后通过 8.5.3p5 的最后一个项目符号获得诊断,因为 T1
和 T2
与引用相关。如果我们假设第 13 条将临时值视为左值,那么以下内容将不起作用
void f(int &&);
int main() {
f(0);
}
因为我们会将右值 ref 绑定(bind)到第 13 条的左值,这将使函数不可行。如果我们将“将右值引用绑定(bind)到左值”解释为引用初始化表达式而不是绑定(bind)到的最终表达式,我们将不会接受以下内容
void f(float &&);
int main() {
int n = 0;
f(n);
}
然而,这从 n3225 开始有效。所以似乎有些困惑 - 我就此向委员会发送了 DR。
关于c++ - 重载分辨率和数组 : which function should be called?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5347444/
我正在使用 JavaFX 开发视频播放器。我正在将视频从本地文件系统加载到 JavaFX 类媒体中。然后我想获取宽度和高度,以便我可以将场景的尺寸设置为该大小: Media media = new M
我是OpenCV的新手,正在尝试解决这个问题。我有一个.mp4文件保存在从网络摄像头流式传输的磁盘上。现在,我需要制作视频的低分辨率版本,以上传到Web服务器(这个想法是,低分辨率预览实时或多或少地上
我在我的应用程序中使用 jfree 图表(折线图)...创建时我的图表看起来很模糊...我怎样才能获得高清晰度图像。 我使用过:ChartUtilities.writeScaledChartAsPNG
我正在用 Java 编写一个工具来处理我网站上上传的文件。我想以特定的方式管理图像:如果尺寸大于限制,我想首先调整图像的尺寸,然后再次检查尺寸。当然,我不想做无用的工作,所以我想在调整图像大小之前估计
是否有一种纯 WPF 方法来获取有关所有可用显示器大小(分辨率)的信息。我知道我可以使用 Screen.AllScreens 来获取它们,但在我的遗留项目中我无法添加新的引用(内置 WPF 程序集除外
看了Developer文档,部分理解了LDPI,HDPI,MDPI,XHDPI类比,网上到处找也没有找到具体答案。 我有两部手机,一部是小屏幕,一部是平板电脑。我希望我的小屏幕手机上的按钮看起来很小,
对于下面给定的网页, xyz {% load staticfiles %} html, body {
我在 Mac 上使用多个 JFrames 制作了一个程序,分辨率还可以,一切都适合屏幕。但是,当我在我的 PC 上运行该程序时,JFrames 太大并且会立即离开屏幕。 我的问题是:是否可以在 JFr
我需要有关如何检索屏幕分辨率的帮助,如下图所示。 我找到了 this documentation这真的很有帮助。这是我根据这些文档尝试的代码: int numberOfScreens = GetSys
有什么方法可以更改分辨率或为亚马逊 Kindle 键盘上的屏幕设置不同的边界?我的屏幕有一部分出现裂纹,我想解决这个问题。 我试过在文件系统中乱搞(通过 WiFi 连接),但我的所有属性更改都没有任何
快速提问, 我正在开发 libgdx 中的游戏,但遇到了问题。我正在尝试扩展我的 Assets ,我正在使用 Gdx.graphics.getDensity() 来获取密度,然后使用它作为乘数来设置我
我有一些关于屏幕分辨率的问题,我不清楚。这些问题假设我的应用程序将在 iOS 4.0 及更高版本以及 iPhone 3GS 或 iPhone 4 上运行。 启动图像 (default.png) 的大小
我们有一个应用程序在审核过程中被 Apple 应用程序审核人员拒绝。拒绝的原因是应用程序在 Ipad 上运行时无法正确缩放。 该应用程序本来就不是要在 Ipad 上运行的,但与他们争论这一点似乎没有意
我试图在不解码文件的情况下获取 JPEG 图像的分辨率。我从互联网上获得了几个样本,但没有一个可以正常工作。似乎是这样,因为许多 JPEG 文件不是标准的,尽管任何图形应用程序(Irfan、PSP、F
我尝试了很多事情,但是所有尝试都失败了。 我需要将灰度图像(2560x1440)调整为更低或更高的分辨率,然后我需要将边界设置为原始大小(2560x1440),但将调整后的图像保持在中心。 我使用的是
我正在使用 GLSulfaceView 开发一个静音相机应用程序,该应用程序从预览中捕获图片。 为了捕捉图片,我使用 GLES20.glReadPixels(0, 0, surfaceWidth, s
是否有相当于 yarn resolutions 的 npm功能? npm package.json docs 中没有提及它. 例如,我想在 3.3.2 上安装 lerna@3.3.2 及其依赖项之一
我制作了一个在 Arduino 上运行的 24x15 LED 显示屏,去年我在内存中放入了 32KB 的图形例程,这很酷。 但现在我已经升级到 Arduino Mega,具有 256KB 内存,并且有
我的场景是,我正在收集网络数据包,如果数据包与网络过滤器匹配,我想记录连续数据包之间的时间差,最后一部分是不起作用的部分。我的问题是,无论我使用什么 C 定时器函数,我都无法获得准确的亚秒级测量。我尝
我们一直在学校布置一项任务,需要更改图像(反转颜色、切换颜色、旋转 90 度、双倍大小、放大图像),现在我正在尝试通过将分辨率加倍来使其大小加倍,但无法弄清楚如何访问该地址并更改它。我们得到了两个函数
我是一名优秀的程序员,十分优秀!