让我们看看下面的代码:
var HideMe=React.createClass({
Hide:function(event)
{
var Selected=$(event.target)[0].id;
$("#"+Selected).removeClass('show');
$("#"+Selected).addClass('hide');
},
Show:function(event)
{
var Selected=$(event.target)[0].id;
$("#"+Selected).removeClass('hide');
$("#"+Selected).addClass('show');
},
render:function()
{
return(
<div>
<div>
<span id="1" onClick={this.Hide}>Click me to Hide</span>
<input type="button" id="1" value="Show" onClick={this.Show}/>
</div>
<div>
<span id="2" onClick={this.Hide}>Click me to Hide</span>
<input type="button" id="2" value="Show" onClick={this.Show} />
</div>
</div>
)
}
});
React.render(
<HideMe />,
document.getElementById('example')
);
编译器如何确定(20)是否应该是int或Test对象? Test的构造函数不明确,那么标准对它有什么看法呢?
答案 0 :(得分:5)
因此,尽管gcc允许auto作为函数中的参数,但根据Herb Sutter的上一次旅行报告,这不是C ++ 14的一部分,而是concepts-lite may become part of C++1z的一部分。
我相信gcc允许这个作为扩展,如果我们使用-pedantic
编译你的程序,gcc会发出警告:
warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]
auto func(auto x)
^
因此,从概念精简提案中我们可以看到:
auto func(auto x)
{
std::cout << x << std::endl;
return x.getx();
}
相当于:
template <typename T1>
auto func(T1 x)
{
std::cout << x << std::endl;
return x.getx();
}
因此x
将推断为 int 。编译器会正确地从gcc( see it live )中给出一个类似下面的错误:
error: request for member 'getx' in 'x', which is of non-class type 'int'
return x.getx();
^
提案部分5.1.1
[dcl.fct] 中介绍了这一点:
在parameter-declaration-clause中使用auto或concept-name 应解释为使用具有相同类型参数的类型参数 约束和命名的概念。 [注意:确切的机制 实现这一目标尚未明确。 - 尾注] [例子:通用 声明如下
auto f(auto x, const Regular& y);
等同于以下声明
template<typename T1, Regular T2> auto f(T1 x, const T2&);
-end example]
答案 1 :(得分:1)
auto
作为参数类型的规则与模板参数的规则相同。
auto func(auto x)
相当于template<typename T> auto func(T x)