gpt4 book ai didi

c++ - 在嵌套模板结构中将引用类型作为模板参数传递不起作用

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

我很困惑,我在设计一个模板时发现了一个关于使用 T=float& 实例化模板的奇怪行为:

// Given an available float f:
float f = 1.0;

// This getter works for T=float&:
template <typename T>
struct test {
const T get() { return f; }
};

int main() {
float& f1 = test<float&>().get();
}

第一个奇怪的事情是 f1 应该是 const float& 以使代码正确,因此,我预计会出现错误,但它工作正常。

第二个奇怪的事情是在这个类似的例子中,当我不希望它报告错误时:

// Given an available float f:
float f = 1.0;

struct State {
const float& get() { return f; }
};

// This does not work for T=float&:
template <typename T>
struct test2 {
State state;
const T get() { return state.get(); }
};

int main() {
const float& f2 = test2<float&>().get();
}

报错是这样的:

main.cpp: In instantiation of 'const T test2<T>::get() [with T = float&]':
main.cpp:31:41: required from here
main.cpp:22:36: error: binding reference of type 'float&' to 'const float' discards qualifiers
const T get() { return state.get(); }

这很奇怪,因为第二个示例只声明了 const float& 类型,而不是 float&const float,所以我不知道发生了什么。

也许模板不是为引用而设计的,或者它是 GCC 上的错误,或者我只是在做一些愚蠢的事情。

我使用 gcc (GCC) 6.3.1 20170306 以及 repl.it 测试了这段代码使用 C++11 的网站。

此外,如果它是一个错误,我会对任何可用的解决方法感兴趣。

最佳答案

只是更专业。我认为这给出了你想要的行为:

template <typename T>
struct test {
T get() { return f; }
};

template <typename T>
struct test<T&> {
const T& get() { return f; }
};

测试:

int main() {      
const float& f1 = test<float&>().get();
float& f2 = test<float&>().get(); //Error
const float& f3 = test<const float&>().get();
float f4 = std::move(test<float>().get());
}

关于c++ - 在嵌套模板结构中将引用类型作为模板参数传递不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44334530/

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