显式模板化强制转换运算符的enable_if给出了"invalid static_cast"

enable_if on explicit templated cast operator gives "invalid static_cast"

本文关键字:if cast invalid enable static 运算符 转换      更新时间:2023-10-16

我正在尝试做一个模板化的显式强制转换运算符。 我发现在符号上,您实际上可以将具有类型特征和std::enable_if的表达式放在运算符的"名称"插槽中。 但以下测试没有给出所需的行为:

#include <iostream>
#include <type_traits>
class WillCast {
public:
    explicit operator int () {
       return 1020;
    }
};
class WontCast {
public:
    template <typename T>
    typename std::enable_if<
        std::is_same<T, int>::value, int
    >::type toInteger()
    {
       return 1324;
    }
    template <typename T>
    explicit operator typename std::enable_if<
        std::is_same<T, int>::value, int
    >::type ()
    {
       return 304;
    }
};
int main() {
    std::cout << static_cast<int>(WillCast{}) << "n";   // ok
    std::cout << WontCast{}.toInteger<int>() << "n";    // ok
    /* std::cout << static_cast<int>(WontCast{}); */     // error 
};

从 gcc 4.8.2 返回的错误是:

test.cpp: In function ‘int main()’:
test.cpp:27:45: error: invalid static_cast from type ‘WontCast’ to type ‘int’
    std::cout << static_cast<int>(WontCast{});

如果我试图做的事情是不可能的,我不会感到惊讶。 但它似乎认为语法没问题,只是在WontCast::toInteger()WillCast::operator int()看到的"附近"行为之间似乎表现不一致。

(这是一个简化的示例,当然我想要的enable_if更棘手。


更新 - "侧边栏智能(tm)"抛出 如何在转换运算符中使用 std::enable_if? 我没有通过"之前你问的情报(tm)"找到。 我会看看它是否有帮助。 好吧,那里使用的解决方案似乎不适用,因为 WontCast 不是一个模板化类。 所以在这里没有帮助。

如果将enable_if部分移动到模板中,则此方法有效:

template <typename T,
          typename = typename std::enable_if<std::is_same<T, int>::value>::type
          >
explicit operator T()
{
    return 304;
}

鉴于:

int i = static_cast<int>(WontCast{}); // ok
double d = static_cast<double>(WontCast{}); // invalid static_cast