'自动'不允许在Clang的函数原型中使用

时间:2015-06-05 11:34:58

标签: c++ auto c++14 clang++

使用Clang 3.5,3.6或3.7,标志为#include <iostream> auto foo(auto bar) { return bar; } int main() { std::cout << foo(5.0f) << std::endl; } ,以下代码无法编译:

<ul class="nav navbar-nav">
                  <li class="active"><a href="#">HOME</a></li>
                  <li><a href="#">OUR PHILOSOPHY</a></li>
                  <li><a href="#">OFFERS</a></li>
                  <li><a href="#">FINE WINE</a></li>
                  <li><a href="#">TOUR & TASTE</a></li>
                  <li><a href="#">CONTACT</a></li>
                  <li><div class="searchBoxContainer col-md-5 pull-right">
                        <div id="searchOurWines">
                          <div id="containerSearch" class="blackBox">
                            <span id="textSearchBox" class="textInBox">SEARCH OUR WINES</span>
                            <span id="iconSearchBox">
                              <span class="icon-icn-bottle"></span>   
                              <a href=""><span id="arrowSearch" class="icon-icn-sort_down pull-right"></span>  
                                 <span id="arrowSearch2" class="icon-icn-sort_up pull-right"></span></a>   
                            </span>
                          </div>  
                        </div> 
                     </div>
                  </li>  
                </ul> 

给出的错误是:

  

错误:&#39; auto&#39;在函数原型中不允许

使用g ++ 4.9时没有错误。 产生这个错误是因为Clang尚未实现此功能还是因为我不被允许这样做而且GCC以某种方式允许它?

4 个答案:

答案 0 :(得分:17)

正如我们从ISO C ++讨论邮件中看到的那样:decltype(auto) parameters vs. perfect forwarding非lambdas的自动参数是concepts lite的一部分,因此不在C ++ 14中:

  

clang是正确的,因为我们还没有自动参数。   Concepts lite可能会带来这些,但C ++ 14没有它们。

如果我们将-pedantic标记与gcc一起使用,则会收到以下警告:

warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]
  auto foo(auto bar) { return bar; }
           ^

所以这看起来像是一个扩展。

正如dyp所指出的那样,polymorphic lambdas确实将它变成了C ++ 14,并且允许自动参数,这是一篇来自论文的例子:

// 'Identity' is a lambda that accepts an argument of any type and
// returns the value of its parameter.
auto Identity = [](auto a) { return a; };
int three = Identity(3);
char const* hello = Identity("hello");

您希望在示例中实现相同的功能。

答案 1 :(得分:8)

虽然你的特定语法没有进入C ++ 14,但是类似的选项是:

static auto foo = [](auto bar) { return bar; };

实现了基本相同的事情。

答案 2 :(得分:3)

您可以改为使用模板:

template<class A>
A foo(A bar) { return bar; }

仅当编译器可以从上下文中推断出类型时才允许自动。

答案 3 :(得分:1)

编译器无法从上下文中推断出类型。

做什么错误

template<typename Y>
Y foo(Y bar){return bar;}

并且您必须按值传递bar吗?

在您的情况下,您可以使用尾随返回类型语法:

auto foo(auto bar) -> decltype(bar)