gpt4 book ai didi

c++ - std::is_constructible 是否使用可转换为参数的参数?

转载 作者:搜寻专家 更新时间:2023-10-31 02:08:25 24 4
gpt4 key购买 nike

是否 std::is_constructible<T, Arg1>工作如果 Arg1是一种可转换为 T 的有效单参数构造函数的类型?当类型具有非模板化转换运算符时它似乎可以工作,但如果转换运算符是模板化的则它不起作用(在某些编译器下)。

在下面的例子中,最后的 static_assert在 GCC 7.2 和 clang 5.0 下失败,但在 MSVC 19 下通过。这里是否存在未定义的行为,或者其中一个编译器行为不当?

#include <type_traits>

struct foo
{
foo(int) {}
foo(int, int) {}
};

struct converts
{
template <class T>
operator T(){}
};

int main()
{
// These compile
foo f1(converts());
foo f2(converts(), converts());
static_assert(std::is_constructible<foo, converts, converts>::value, "foo(converts(), converts())");
// This line doesn't
static_assert(std::is_constructible<foo, converts>::value, "foo(converts())");
}

实例:https://godbolt.org/g/EcFqMP

最佳答案

这只是一个最令人烦恼的解析问题。由于行 foo f1(converts()) 可以被视为函数 f1 的声明,编译器必须 em> 将其视为声明。如果您将括号换成大括号,第一行将停止编译:

int main()
{
foo f1{converts()}; // Now broken
foo f2{converts(), converts()};
}

Live on godbolt

错误信息告诉我们编译器无法确定是调用foo(int),还是foo(const foo&),还是foo (foo&&),因为 converts 也可以使用其模板化转换运算符转换为 foo

当您使用括号时,we can see通过使用 decltype,编译器将 f1 视为类型为 foo(converts(*)()) 的函数的声明——一个函数返回foo,它接受一个函数指针作为参数。

关于c++ - std::is_constructible 是否使用可转换为参数的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47564091/

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