C ++ 14标准对auto作为参数类型的说法是什么

时间:2015-11-09 10:22:36

标签: c++ c++14 auto

让我们看看下面的代码:

 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的构造函数不明确,那么标准对它有什么看法呢?

2 个答案:

答案 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)

但是,我不是律师引用特定规则的标准。