gpt4 book ai didi

gcc和clang之间的C++不一致

转载 作者:IT老高 更新时间:2023-10-28 12:48:55 24 4
gpt4 key购买 nike

我遇到了 gcc 之间的 C++ 不一致。 (版本 4.8.14.8.2 )和 clang (版本 3.33.4 )。我想知道哪个是正确的。这是程序:

template < typename T > struct Result {};
template < typename T > struct Empty {};

template < typename T >
struct Bad_Type_Fcn {
typedef typename Empty< T >::type type;
};

template < typename T >
Result< T >
f( const T& ) {
return Result< T >();
}

template< class U >
Result< typename Bad_Type_Fcn< U >::type >
f( const U&, int ) {
return Result< typename Bad_Type_Fcn< U >::type >();
}

int main() {
(void)f< int >(42);
}

显然,这段代码并不意味着做任何事情;它是对 Boost Range 库中出现的内容的积极简化(f 简化了 make_iterator_range )。 Bad_Type_Fcn是一个永远不应该实例化的类型函数(技术上是 struct ),因为 Empty<T>::type从来不存在,对于任何 T .这个的存在structf() 的第二个模板特化本身并不是错误。爱尔兰,f()为某些类型提供一些功能,Bad_Type_Fcn不是空的。然而,这不是这里的问题,这就是我简化这些的原因。我还想要f()适用于 Bad_Type_Fcn 的类型是空的。

我正在使用 {g++|clang++} [-std=c++0x] -pedantic -Wall -Wextra -c 进行编译.语言标准的选择似乎没有什么不同。与 clang ,程序编译没有错误或警告。与 gcc ,我得到一个错误:

weird.cpp: In instantiation of ‘struct Bad_Type_Fcn<int>’:
weird.cpp:17:5: required by substitution of ‘template<class U> Result<typename Bad_Type_Fcn<T>::type> f(const U&, int) [with U = int]’
weird.cpp:22:26: required from here
weird.cpp:6:43: error: no type named ‘type’ in ‘struct Empty<int>’
typedef typename Empty< T >::type type;

似乎正在发生的是 clang消除了 f() 的第二次重载,可能(?)基于仅使用 1 个参数进行调用,整数 42 ,而第二个重载需要 2 个参数。另一方面,gcc不会消除第二个重载,而是尝试实例化 struct Bad_Type_Fcn<int> ,这会导致错误。

如果我删除对 f() 的调用中的显式实例化,不一致就会消失。 , 并写下 (void)f(42);而是。

哪个编译器是正确的?

最佳答案

我记得 WG21 对此的核心讨论,其中一位 Clang 开发人员通过引用 14.7.1p7 为自己的立场辩护

If the overload resolution process can determine the correct function to call without instantiating a class template definition, it is unspecified whether that instantiation actually takes place.

另一方面,对于格式不正确的程序(在进行所需的实例化时就是这种情况),没有“要调用的正确函数”这样的概念,所以我同意另一个人的立场在那次讨论中,他说他看不到这允许 Clang 走那条路。

在 p7 的示例中,它显示了格式良好的代码,无论是否进行额外的实例化。

在任何情况下,即使允许 Clang 这样做,您的程序的良好格式也会依赖于特定的偶然事件(未指定的行为)。因此,该标准不再要求您的程序被接受,老实说,我不知道这意味着什么。我认为这样的代码格式不正确。

关于gcc和clang之间的C++不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22258054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com