参数包后具有非推导类型的参数

时间:2016-12-21 12:16:28

标签: c++ g++ variadic-templates clang++ c++17

clang ++ g ++ 在下一个程序中有不同的行为:

<?php

namespace app\PibeBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Translatable\Translatable;
use Application\Sonata\MediaBundle\Entity\Media;

/**
 * Pibe
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class pibe
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

  /**
 * @var string
 * @var \Application\Sonata\MediaBundle\Entity\Media
 * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"persist"}, fetch="LAZY")
 */
private $imagen;

  /**
 * @var string
 * @var \Application\Sonata\MediaBundle\Entity\Media
 * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"persist"}, fetch="LAZY")
 */

private $logoEs;

  /**
 * @var string
 * @var \Application\Sonata\MediaBundle\Entity\Media
 * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"persist"}, fetch="LAZY")
 */
private $logoEn;


 /**
 * @var string
 * @Gedmo\Translatable
 * @ORM\Column(name="titulo", type="text",nullable=true)
 */
private $titulo;

      /**
 * @var string
 * @Gedmo\Translatable
 * @ORM\Column(name="script", type="text", nullable=true)
 */

private $script;


 /**
 * @var string
 */
private $scriptEn;


 /**
 * Set imagen
 *
 * @param string $imagen
 * @return ImagenesHome
 */
public function setScript($script)
{
    $this->script = $script;

    return $this;
}

/**
 * Get imagen
 *
 * @return string 
 */
public function getScript()
{
    return $this->script;
}


     /**
 * Set imagen
 *
 * @param string $imagen
 * @return ImagenesHome
 */
public function setScriptEn($scriptEn)
{
    $this->scriptEn = $scriptEn;

    return $this;
}

/**
 * Get imagen
 *
 * @return string 
 */
public function getScriptEn()
{
    return $this->scriptEn;
}



 /**
 * @var string
 */
private $tituloEn;


 /**
 * @var string
 * @Gedmo\Translatable
 * @ORM\Column(name="texto", type="text",nullable=true)
 */
private $texto;

 /**
 * @var string
 */
private $textoEn;

    /**
 * @var boolean
 *
 * @ORM\Column(name="activo", type="boolean")
 */
private $activo;

/**
 * @var integer
 *
 * @ORM\Column(name="ranking", type="integer")
 */
private $ranking;


 /**
 * @var string
 * @Gedmo\Locale 
 */
private $locale;



/**
 * Get id
 *
 * @return integer 
 */
public function getId()
{
    return $this->id;
}


/**
 * Set imagen
 *
 * @param string $imagen
 * @return BannerHome
 */
public function setImagen(Media $imagen=null)
{
    $this->imagen = $imagen;

    return $this;
}

/**
 * Get imagen
 *
 * @return string 
 */
public function getImagen()
{
    return $this->imagen;
}




/**
 * Set imagen
 *
 * @param string $imagen
 * @return BannerHome
 */
public function setLogoEs(Media $logoEs)
{
    $this->logoEs = $logoEs;

    return $this;
}

/**
 * Get imagen
 *
 * @return string 
 */
public function getLogoEs()
{
    return $this->logoEs;
}

/**
 * Set imagen
 *
 * @param string $imagen
 * @return BannerHome
 */
public function setLogoEn(Media $logoEn)
{
    $this->logoEn = $logoEn;

    return $this;
}

/**
 * Get imagen
 *
 * @return string 
 */
public function getLogoEn()
{
    return $this->logoEn;
}

/**
 * Set titulo
 *
 * @param string $titulo
 * @return BannerHome
 */
public function setTitulo($titulo)
{
    $this->titulo = $titulo;

    return $this;
}

/**
 * Get titulo
 *
 * @return string 
 */
public function getTitulo()
{
    return $this->titulo;
}

/**
 * Set titulo
 *
 * @param string $titulo
 * @return BannerHome
 */
public function setTituloEn($tituloEn)
{
    $this->tituloEn = $tituloEn;

    return $this;
}

/**
 * Get titulo
 *
 * @return string 
 */
public function getTituloEn()
{
    return $this->tituloEn;
}

/**
 * Set texto
 *
 * @param string $texto
 * @return BannerHome
 */
public function setTexto($texto)
{
    $this->texto = $texto;

    return $this;
}

/**
 * Get texto
 *
 * @return string 
 */
public function getTexto()
{
    return $this->texto;
}



/**
 * Set texto
 *
 * @param string $texto
 * @return BannerHome
 */
public function setTextoEn($textoEn)
{
    $this->textoEn = $textoEn;

    return $this;
}

/**
 * Get texto
 *
 * @return string 
 */
public function getTextoEn()
{
    return $this->textoEn;
}

  /**
 * Set activoBoolean
 *
 * @param string $activoBoolean
 * @return BannerHome
 */
public function setActivo($activo)
{
    $this->activo = $activo;

    return $this;
}

/**
 * Get activoBoolean
 *
 * @return string 
 */
public function getActivo()
{
    return $this->activo;
}

/**
 * Set ranking
 *
 * @param integer $ranking
 * @return BannerHome
 */
public function setRanking($ranking)
{
    $this->ranking = $ranking;

    return $this;
}

/**
 * Get ranking
 *
 * @return integer 
 */
public function getRanking()
{
    return $this->ranking;
}

public function setTranslatableLocale($locale) { 


    $this->locale = $locale;


}

}

Live example

它只是试图恢复传递的参数并将一些函数应用于它们。

对于 G ++ ,它编译得很好,但对于 clang ++ (甚至来自主干),它会出现以下错误:

  

错误:没有匹配函数来调用'apply_inverse'

我认为原因在于,在上部重载中,函数原型中的参数包后面有一个参数。但是显式指定了参数包中所有参数的类型。

编译器接受代码是否正确?

1 个答案:

答案 0 :(得分:0)

没有具体说明是哪个版本的 Clang 拒绝了上面的代码。

但此时 Clang 12 接受了它,以及 GCC 和 MSVC: https://gcc.godbolt.org/z/qMc9fKTEf

所以代码是完全合法的。