Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以用decltype替换enable_if吗_C++_Visual Studio_Gcc_Decltype_Enable If - Fatal编程技术网

C++ 我可以用decltype替换enable_if吗

C++ 我可以用decltype替换enable_if吗,c++,visual-studio,gcc,decltype,enable-if,C++,Visual Studio,Gcc,Decltype,Enable If,我在想,如果,我能用它来代替启用吗?例如: template <typename T> decltype(T(), declval<bool>()) isConstructable() { return true; } 模板 decltype(T(),declval())是可构造的(){return true;} 在Visual Studio 2015上使用isConstructable成功,在isConstructable失败:但在: 模板 如果是可构造的(){re

我在想,如果,我能用它来代替启用吗?例如:

template <typename T>
decltype(T(), declval<bool>()) isConstructable() { return true; }
模板
decltype(T(),declval())是可构造的(){return true;}
在Visual Studio 2015上使用
isConstructable
成功,在
isConstructable
失败:但在:

模板
如果是可构造的(){return true;}则启用

decltype
版本是否有效,或者我只是在利用一个非标准的MicrosoftianSim?

std::declval()的类型是
bool&
,而不是
bool
。这就是警告的来源-
true
需要通过引用返回

类似的内容应该在没有警告的情况下编译:

bool ok() { return true; }

template <typename T>
decltype(T(), ok()) is_constructable() { return true; }

int main() {
    cout << is_constructable<int>() << endl;
}
bool ok(){return true;}
模板
decltype(T(),ok())是可构造的(){return true;}
int main(){
cout如所述,如果您这样做:

is_rvalue_reference_v<decltype(isConstructable<int>())>

T
可能重载了
运算符,在这种情况下,需要缓冲
void()

template <typename T>
decltype(T(), void(), bool()) isConstructable() { return true; }
模板
decltype(T(),void(),bool())是可构造的(){return true;}

如果您使用traits for
std::enable\u,如果
您可以有正确和错误的版本。它不是(总是)有了
decltype
@Jarod42,我实际上只是想在
decltype
/
enable_如果
失败的情况下寻找一个编译错误,所以我不打算用错误的专门化来使用它,尽管我可以看出这是
decltype
版本不可用的用例。@JonathanMee:如果你只是想如果不是编译错误,只需按正常方式编写模板代码。如果它导致代码无法工作,则会导致编译错误。@Nicolas我实际上对使用它很感兴趣,就像在元编程中使用实际值一样。我只是将构造用作MCVE,我实际上有一个函数正在测试可用性,我将使用这个函数有趣的是,似乎您在gcc上是正确的,但在Visual Studio上是错误的:
declval
实现似乎是这里的问题。
decltype(T(),void(),true)
应该足够了。(
void()
添加以避免
操作符的邪恶重载,
)@Jarod42说得好,如果
enable\u
,这在
enable\u如果
void
中会发生什么?我也需要用
void
进行缓冲吗?既然
enable\u如果
只接受两个参数,我该如何处理呢。@JonathanMee:如果t
,它将是
std::enable\u如果t
(或者在你的例子中,使用traits
std::enable\u如果t
template <typename T>
decltype(T(), bool()) isConstructable() { return true; }
template <typename T>
decltype(T(), void(), bool()) isConstructable() { return true; }