小编psy*_*ill的帖子

变量模板作为模板参数:演绎适用于GCC但不适用于Clang

在用GCC 4.7.2和Clang 3.1编译一些C++ 11代码时,我遇到了一个问题,Clang没有设法推断出GCC成功的模板参数.在更抽象的形式中,代码如下所示:

SRC/test.cc:

struct Element {
};

template <typename T>
struct FirstContainer {
};

template <typename T, typename U = Element>
struct SecondContainer {
};

template <template <typename> class Container>
void processOrdinary(Container<Element> /*elements*/) {
}

template <template <typename, typename> class Container>
void processOrdinary(Container<Element, Element> /*elements*/) {
}

template <template <typename, typename...> class Container>
void processVariadic(Container<Element> /*elements*/) {
}

int main() {
  // This function instantiation works in both GCC and Clang.
  processOrdinary(FirstContainer<Element>{});
  // This function instantiation works in …
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang variadic-templates c++11

22
推荐指数
1
解决办法
928
查看次数

使用签名中的另一个成员模板函数定义外部成员模板函数定义

我在一些现实生活中的C++ 11代码中遇到了这个问题,但我把它归结为:

template<int i> struct Dummy {};

template<typename T>
struct Foo {
  template<int i> static constexpr int bar() { return i; }

  template<int i>
  static auto working() -> Dummy<bar<i>()>;

  template<int i>
  static auto also_working() -> Dummy<Foo<T>::template bar<i>()>;

  template<int i>
  static Dummy<Foo<T>::template bar<i>()> not_working();
};

template<typename T> template<int i>
auto Foo<T>::working() -> Dummy<bar<i>()> {
  return Dummy<bar<i>()>{};
}

template<typename T> template<int i>
auto Foo<T>::also_working() -> Dummy<Foo<T>::template bar<i>()> {
  return Dummy<bar<i>()>{};
}

template<typename T> template<int i>
Dummy<Foo<T>::template bar<i>()> Foo<T>::not_working() {
  return Dummy<bar<i>()>{};
} …
Run Code Online (Sandbox Code Playgroud)

templates language-lawyer c++11 trailing-return-type

10
推荐指数
1
解决办法
157
查看次数

为什么std :: extent应用于auto并且产生零?

我是用实验constexpr auto和字符串来获得字符数组我可以用std::begin一个通用的方式,当我遇到一些我无法解释:表达式std::extent<decltype(foo)>::value,在foo使用自动参考宣布,产量为零.

 #include <iostream>
 #include <type_traits>

 namespace {
   auto& ARRAY_REFERENCE = "foo";

   template<typename T, std::size_t N>
   std::size_t numberOfElementsIn(T (&)[N]) { return N; }
 }

 int main() {
   std::cerr <<
     "std::extent applied to ARRAY_REFERENCE: " << std::extent<decltype(ARRAY_REFERENCE)>::value << "\n"
     "Number of elements in ARRAY_REFERENCE: " << numberOfElementsIn(ARRAY_REFERENCE) << "\n"
     ;
   return 0;
 }
Run Code Online (Sandbox Code Playgroud)

上面的代码给了我输出

std::extent applied to ARRAY_REFERENCE: 0
Number of elements in ARRAY_REFERENCE: 4
Run Code Online (Sandbox Code Playgroud)

为什么涉及的表达式不能std::extent评估为4?

c++ c++11

7
推荐指数
1
解决办法
158
查看次数