为什么基类不会在相同的“自动”声明中自动推断出来?

时间:2011-07-02 06:40:14

标签: c++ c++11 language-lawyer type-declaration

以下与auto相关的错误,可以理解:

auto i = int(), d = double(); // error: inconsistent deduction for ‘auto’

但是,为什么跟随者会受到同样的错误:

struct B {};
struct D : B {};

const auto &b1 = B(), &b2 = D(); // error: inconsistent deduction for ‘auto’

众所周知,b1已被推断为const B&,编译器是否也无法尝试b2 const B&? (如果将b2推断为const B&会导致什么样的危险呢?)

2 个答案:

答案 0 :(得分:6)

危险将是意想不到的结果......当您创建D时,您希望得到D作为结果。还有一个事实是有一个演员阵容......它是一个“安全”的演员阵容,但是一个演员阵容。可以为第一个示例提供相同的参数...为什么编译器不会只生成dint,因为double可以简单地转换,并且它已经确定是基于i的结果的类型。或者你有两个兄弟类的情况......他们是否应该解决共同基础?

如果您希望编译该代码,您可以始终显式地转换D()的结果,以便两个表达式产生相同的类型。

对语言律师来说:

[decl.spec.auto] / 7:

  

如果声明符列表包含多个声明符,则每个声明的变量的类型如上所述确定。如果模板参数U的推导类型在每次推断中不相同,则程序格式不正确。

答案 1 :(得分:0)

没有。编译器没有那种自由。属于同一声明的所有auto变量必须属于同一类型。

回答这个问题。为什么编译器无法调用此float版本:

void f(int);
void f(float);

f(10.5);

因为,当涉及歧义时,编译器没有自动推断出正确功能的自由。