以下与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&
会导致什么样的危险呢?)
答案 0 :(得分:6)
危险将是意想不到的结果......当您创建D时,您希望得到D作为结果。还有一个事实是有一个演员阵容......它是一个“安全”的演员阵容,但是一个演员阵容。可以为第一个示例提供相同的参数...为什么编译器不会只生成d
和int
,因为double
可以简单地转换,并且它已经确定是基于i
的结果的类型。或者你有两个兄弟类的情况......他们是否应该解决共同基础?
如果您希望编译该代码,您可以始终显式地转换D()
的结果,以便两个表达式产生相同的类型。
对语言律师来说:
[decl.spec.auto] / 7:
如果声明符列表包含多个声明符,则每个声明的变量的类型如上所述确定。如果模板参数U的推导类型在每次推断中不相同,则程序格式不正确。
答案 1 :(得分:0)
没有。编译器没有那种自由。属于同一声明的所有auto
变量必须属于同一类型。
回答这个问题。为什么编译器无法调用此float
版本:
void f(int);
void f(float);
f(10.5);
因为,当涉及歧义时,编译器没有自动推断出正确功能的自由。