其中一个issues的nlohmann / json开源库引起了我的注意。
我对does not compile几个版本的桌面gcc(4.8,4.9,也尝试过5+)的情况进行了极少的复制,但是与mac clang和Android ndk的gcc 4.9编译得很好} p>
#include <limits>
struct base {
virtual void foo() = 0;
};
int main() {
(void)numeric_limits<base>::is_signed;
}
GCC正试图用基类来实例化std::numeric_limits
而不是派生:
/usr/include/c++/4.8/limits: In instantiation of 'struct std::numeric_limits<base>': main.cpp:11:94: required from here
/usr/include/c++/4.8/limits:309:7: error: cannot allocate an object of abstract type 'base'
min() _GLIBCXX_USE_NOEXCEPT { return _Tp(); }
我不太确定这是否是已知的编译器错误(如果失败)或功能/放宽规则(如果成功)
我已尝试使用std::is_abstract
来解决这个问题,但它没有帮助,看起来像是短路&#39; enable_if中没有发生评估,错误保持不变
我的问题主要不是如何为gcc修复此问题,但天气这是编译器错误或代码错误
编辑:添加&#34;更小的&#34;没有任何标准库依赖的示例:
template <typename T>
struct foo
{
static T bar();
static constexpr bool value = true;
};
struct abstract
{
virtual ~abstract() = 0;
};
int main()
{
(void) foo<abstract>::value;
}
在clang 3.9.0上编译,但gcc 7快照为无效的返回类型foo<abstract>::bar
发出错误。
编辑2:我有点惊讶我的初始问题是在未经我同意的情况下编辑的,不知道SO允许:)感谢帮助虽然我认为它带来了一些混乱和错误的答案,主要是因为文本和代码不再连接
答案 0 :(得分:1)
否,这不是错误。这只是一个糟糕的考验。
在这种情况下,GCC
和clang
之间的唯一区别是它们处理模板类函数的方式:
GCC
:所有这些都在一次。clang
:只使用过的那个。在我们的第一个示例中,函数min()
未被调用,因此clang
没有问题。 GCC
,解析所有功能,发现min()
无效。
在第二个示例中,同样的情况发生:bar()
没有被任何人调用,因此clang
可以判断它是不正确的。但是,GCC
再次出现问题,尽管在程序的任何地方都没有使用过。
说某些事情不好是不够的,让我们解决一下:这个示例会因GCC
和clang
失败而导致几乎相同的错误(invalid abstract return type ‘base’
或allocating an object of abstract class type 'base'
)。
#include <limits>
struct base {
virtual void foo() = 0;
};
int main() {
(void)std::numeric_limits<base>::min();
}