删除的模板功能适用于gcc,但不适用于clang

时间:2017-07-24 15:29:40

标签: c++ gcc clang

我遇到了已删除模板功能的模板特化问题。下面的代码显示了问题归结为MWE:

#include <iostream>
#include <string>

template<typename T>
inline std::string typeToString() = delete;

template<>
inline std::string typeToString<float>()
{
    return "float";
}

int main()
{
    std::cout << typeToString<float>() << std::endl;
}

使用gcc 7编译好。但是,对于Apple LLVM 8.0.0,我收到以下错误消息:

clang test.cpp -std=c++1z
test.cpp:8:28: error: inline declaration of 'typeToString<float>' follows non-inline definition
    inline std::string typeToString<float>()
                       ^
test.cpp:8:28: note: previous definition is here
test.cpp:15:18: error: call to deleted function 'typeToString'
std::cout << typeToString<float>() << std::endl;
             ^~~~~~~~~~~~~~~~~~~
test.cpp:8:28: note: candidate function [with T = float] has been explicitly deleted
    inline std::string typeToString<float>()

1 个答案:

答案 0 :(得分:1)

这看起来像是一个错误。如果使用clang 3.9.1或更高版本进行编译,则会编译。使用clang 3.8.1的GolboltWandbox的以下示例失败,但是当我们更改为3.9.1时,它们都会编译。