相关疑难解决方法(0)

是否转换为指向模板的指针实例化该模板?

static_cast<the_template<int>*>(0)- 这是否the_template与类型实例化int

询问的原因是以下代码,在链接时将错误地引用check_error<char>(void*, long)与Clang和GCC 4.4.5 的未定义引用,表明它没有实例化模板.然而,MSVC和GCC 4.5.1编译和链接就好了,导致相信它确实实例化了模板.但是,如果省略演员表,MSVC和GCC(4.4.5和4.5.1)将check_error<char>仅出错(所需行为),而Clang将在两次调用时出错.通常我相信Clang在整合东西方面,但我想知道:

哪个编译器是正确的,标准对此有何看法?


#include <type_traits>

template<class T>
void check_error(void*, long);

template<class T>
struct foo{
  template<class U>
  friend typename std::enable_if<
    std::is_same<T,U>::value
  >::type check_error(foo<T>*, int){}
};

template struct foo<int>;

int main()
{
  check_error<int>(static_cast<foo<int>*>(0), 0);
  check_error<char>(static_cast<foo<char>*>(0), 0);
}
Run Code Online (Sandbox Code Playgroud)

c++ templates language-lawyer c++11

29
推荐指数
2
解决办法
1255
查看次数

声明一个负长度数组

在创建负长度数组时,C中会发生什么?

例如:

int n = -35;

int testArray[n];

for(int i = 0; i < 10; i++)
    testArray[i]=i+1;
Run Code Online (Sandbox Code Playgroud)

此代码将编译(并且在启用-Wall时不会显示任何警告),并且您似乎可以testArray[0]毫无问题地分配.分配过去会产生段错误或非法指令错误,并从数组中读取任何内容称"中止陷阱"(我不熟悉那个).我意识到这有点学术性,并且(希望)永远不会出现在现实生活中,但C标准是否有任何特定的方式来对待这样的数组,或者它是否因编译器而异?

c arrays gcc c99

15
推荐指数
1
解决办法
9668
查看次数

标签 统计

arrays ×1

c ×1

c++ ×1

c++11 ×1

c99 ×1

gcc ×1

language-lawyer ×1

templates ×1