以下代码在 GCC (4.9.3) 和 VC++ (19.00.23506) 中编译良好,但在 Clang (3.7.0) 中给出这些错误。
错误:constexpr 函数的返回类型“Foo”不是文字类型
注意:“Foo”不是字面意思,因为它不是聚合并且没有
除复制或移动构造函数之外的 constexpr 构造函数
Code:
#include <iostream>
#include <vector>
struct Foo
{
std::vector<int> m_vec;
Foo(const int *foo, std::size_t size=0):m_vec(foo, foo+size)
{;}
//Foo(const std::initializer_list<int> &init):m_vec{init}
//{;}
};
template <std::size_t N>
constexpr Foo make_fooArray(const int (&a)[N]) noexcept
{
return {a,N};
}
int main()
{
Foo f{ make_fooArray({1,2,3}) };
for (auto i : f.m_vec)
std::cout<< i <<" ";
std::cout<<std::endl;
}
在 rextester 上运行的代码:
海湾合作委员会和风险投资公司
Clang
您能澄清一下这是编译器错误还是我错过了什么? C++11 标准怎么说?
这是另一种情况,它可以在 GCC 和 VC 中编译,但不能在 Clang 中编译。
#include <iostream>
template <typename T, std::size_t N>
constexpr std::size_t sizeOf_fooArray(const T (&)[N]) noexcept
{
return N;
}
int main()
{
std::cout<< sizeOf_fooArray({16,20,53,87,54,7}) <<std::endl;
}
但是,如果您为 int[] 指定别名并显式使用它来指定initializer_list 的类型,则它适用于所有编译器。
#include <iostream>
template <typename T, std::size_t N>
constexpr std::size_t sizeOf_fooArray(const T (&)[N]) noexcept
{
return N;
}
using intArray = int[]; //Added
int main()
{
std::cout<< sizeOf_fooArray(intArray{16,20,53,87,54,7}) <<std::endl;
}