请考虑以下代码:
template<typename T>
class scalar_reference
{
public:
template<typename U>
scalar_reference(U&& value)
: m_value(std::forward<U>(value))
{}
T const& operator()() const { return m_value; }
private:
T m_value;
};
template<typename T>
scalar_reference<T> foo(T&& value) {
return scalar_reference<T>{ std::forward<T>(value) };
}
意图是scalar_reference
返回的foo
持有std::decay_t<T>
的const引用,只要foo
使用左值和foo
调用int x; foo(x)
使用右值调用。
上述代码不起作用。例如,如果我们调用T
,int&
将operator()
,因此int&
也将返回const
(因为public static void main(String[] args) {
String option1 = "o1v1,o1v2,o1v3";
String option2 = "o2v1,o2v2,o2v3";
String option3 = "o3v1,o3v2,o3v3";
ArrayList<String> output = new ArrayList<String>();
String[] options1 = option1.split(",");
String[] options2 = option2.split(",");
String[] options3 = option3.split(",");
for(int i=0; i<options1.length; i++){
StringBuilder sb = new StringBuilder();
sb.append(options1[i]);
sb.append(options2[i]);
sb.append(options3[i]);
output.add(sb.toString());
}
System.out.println(output);
}
限定符没有对参考类型的影响)。
那么,我们如何更改代码?
答案 0 :(得分:2)
operator()
的返回类型是唯一的问题吗?如果是这样,您可以先删除引用:
std::decay_t<T> const& operator()() const { return m_value; }