gpt4 book ai didi

c++ - 我可以使用 declval 来构造一个未使用的返回值吗?

转载 作者:行者123 更新时间:2023-11-30 01:34:50 26 4
gpt4 key购买 nike

假设我有一个将要专门化的模板化函数,所以我真的不关心基本实现。我可以做这样的事情吗:

template <typename T>
T dummy() {
assert(false);
return declval<T>();
}

当我尝试在 中执行此操作时我收到链接错误:

unresolved external symbol char const && __cdecl std::declval<char const >(void) (??$declval@$$CBD@std@@YA$$QEBDXZ) referenced in function char const __cdecl dummy<char const>()

同样,这个函数没有被调用,但我确实保存了一个指向它的指针。我可以使用 return T{}相反,它会编译,但即使没有 T 的默认构造函数,我也需要它才能工作.有什么办法可以解决这个问题吗?

最佳答案

您可以通过不提供函数模板的定义来解决这个问题。使用

template <typename T>
T dummy();

template <>
int dummy() { std::cout << "template <> int dummy()"; return 42;}

int main()
{
dummy<int>();
dummy<double>();
return 0;
}

您将收到链接器错误,因为 dummy<double>();不存在,但如果您将其注释掉,那么代码将编译,因为确实存在 int 的专门化.这意味着您不必担心退回任何东西。


你甚至可以使用

template <typename T>
T dummy() = delete;

与其不提供定义,不如得到链接器错误,你会得到一个“不错”的编译器错误,说明你正在尝试使用已删除的函数。这也允许您编写重载而不是特化,这是更可取的,因为在重载决策期间不考虑特化。这在您的情况下实际上是不可能的,因为您不采用任何参数,但如果您这样做,您应该考虑它。

关于c++ - 我可以使用 declval 来构造一个未使用的返回值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55578839/

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