【问题标题】:non-class rvalues always have cv-unqualified types非类右值总是有 cv 非限定类型
【发布时间】:2011-01-11 07:31:01
【问题描述】:

§3.10 第 9 节说“非类右值始终具有 cv 非限定类型”。这让我想知道......

int foo()
{
    return 5;
}

const int bar()
{
    return 5;
}

void pass_int(int&& i)
{
    std::cout << "rvalue\n";
}

void pass_int(const int&& i)
{
    std::cout << "const rvalue\n";
}

int main()
{
    pass_int(foo()); // prints "rvalue"
    pass_int(bar()); // prints "const rvalue"
}

根据标准,非类类型没有 const rvalue 这样的东西,但 bar() 更喜欢绑定到 const int&amp;&amp;。这是编译器错误吗?

编辑:显然,this 也是一个 const rvalue :)

编辑:这个问题似乎在 g++ 4.5.0 中得到修复,现在两行都打印“rvalue”。

【问题讨论】:

  • 哇,好问题。我希望我能投票两次。
  • 如果可以的话,我会为答案提供 100 分奖励。
  • 您使用的是哪个编译器? g++ 4.3.2 抱怨无法使用 const 变体重载 pass_int 函数。
  • 在 GCC4.6 中,这会打印两次“右值”。

标签: c++ c++11 rvalue-reference rvalue


【解决方案1】:

委员会似乎已经意识到标准的这一部分存在问题。 CWG issue 690 谈到了与标准完全相同的部分(在 2009 年 9 月的“附加说明”中)有一些类似的问题。我猜很快就会为标准的这一部分起草新的语言。

编辑:我刚刚在 comp.std.c++ 上提交了一篇文章,指出了问题并为标准的相关部分提出了新的措辞。不幸的是,作为一个有节制的新闻组,当它通过那里的批准队列时,几乎每个人都可能已经忘记了这个问题。

【讨论】:

  • 稍后编辑新信息,问题应该会出现在 active 选项卡中。
  • 那么,消息被批准了吗?
  • 消息已被批准并发布,但没有人回复/跟进(还没有?)
  • @Jerry: 运气好,还是死了?
  • @GMan:它似乎已经死了——根本没有人跟进。
【解决方案2】:

好点子。我想有两件事要看:1)正如你指出的非类右值事物和 2)重载解析是如何工作的:

最佳选择标准 函数是参数的数量, 论据与 候选参数类型列表 功能,[...]

我没有在标准中看到任何告诉我非类右值在重载解析期间被特殊处理的内容。

您的问题在我所拥有的标准草案 (N-4411) 中有所涉及:

然而,真正起作用的是对引用绑定、隐式转换序列、引用和重载解析的并行阅读:

13.3.3.1.4 参考绑定

2 当引用类型的参数 不直接绑定到参数 表达式,转换序列 是将参数表达式转换为基础表达式所需的 参考类型根据 到 13.3.3.1。

13.3.3.2 对隐式转换序列进行排序

3 的两个隐式转换序列 相同的形式是无法区分的 转换序列,除非其中之一 以下规则适用:

——标准转换序列 S1 是一个比 S1 更好的转换序列 标准
转换序列S2 if

— S1 和 S2 是引用绑定 (8.5.3),两者都没有引用 a 的隐式对象参数 非静态 没有引用限定符声明的成员函数,并且任一 S1 绑定一个 左值参考 到左值,S2 绑定右值引用或 S1 绑定右值 引用右值和 S2 绑定一个左值引用。

[示例:

int i;
int f();
int g(const int&);
int g(const int&&);
int j = g(i); // calls g(const int&)
int k = g(f()); // calls g(const int&&)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    相关资源
    最近更新 更多