Known Quirks and Issues
Capturing view proxies with auto
По дизайнуПосмотреть проксиВременные предметы не возвращаются. Они возвращают ссылку на аргумент, который они берут по ссылке (const), брошенный на ссылку неопределенного типа, который не копируется. Из-за этого обратное значениепрокси просмотране может быть захваченоавто:
auto tr=transposed(m); //Error: the return type of transposed can not be copied.
Правильное использованиеавтоспрокси просмотра:
auto & tr=transposed(m);
Note:
Многиепрокси-серверыне являются только для чтения, то есть изменения, внесенные впрокси-сервер просмотра, работают на исходном объекте. Это еще одна причина, по которой они не могут быть захваченыавтопо стоимости.
Binding QVM overloads from an unrelated namespace
Перегрузки оператора в пространстве именповышают::qvmпредназначены для работы с определяемыми пользователем типами. Как правило, достаточно сделать эти операторы доступными в пространстве имен, где используется оператор, посредствомс помощью увеличения пространства имен::qvm. Проблема возникает, если область применения оператора не контролируется пользователем. Например:
namespace ns1
{
struct float2 { float x, y; };
}
namespace ns2
{
using namespace boost::qvm;
void f()
{
ns1::float2 a, b;
a==b; //OK
ns1::float2 arr1[2], arr2[2];
std::equal(arr1,arr1+2,arr2); //Error: operator== is inaccessible from namespace std
}
}
Вstd:: равноевыражение выше, даже еслиboost:::qvm::оператор ==сделан видимым в пространстве именns2с использованием импульса пространства имен::qvm, вызов происходит из пространства именstd. В этом случае компилятор не может связатьboost::qvm::operator==, потому что только пространство именns1видно через ADL, и оно не содержит подходящей декларации. Решение состоит в том, чтобы объявитьоператор ==в пространстве именns1, что можно сделать следующим образом:
namespace ns1 { using boost::qvm::operator==; }
Link errors when calling math functions with int arguments
Усиление QVM не вызывает стандартных математических функций (например,sin,cosи т.д.) непосредственно. Вместо этого он называет шаблоны функций, объявленные вboost/qvm/math.hppв пространстве именboost::qvm. Это позволяет пользователю специализировать эти шаблоны для определенных пользователемскалярныхтипов.
Сам Boost QVM определяет специализации шаблонов математических функций только дляплавающихидвойных, но не предоставляет общих определений. Это делается для защиты пользователя от непреднамеренного написания кода, который связывает стандартные математические функции, которые принимаютдвойныепри передаче аргументов меньших типов, что было бы неоптимальным.
Из-за этого вызов, напримерrot_mat(ось,1), будет успешно компилироваться, но не будет связываться, поскольку он вызывает, например, повышение::qvm::sin, которое не определено. Поскольку вращение по целочисленному числу радианов редко требуется, в QVM нет защиты от таких ошибок. В таких случаях решение заключается в использованииrot_mat(ось 1,0f)вместо этого.
MSVC 2013 parsing bug
Из-за ошибки MSVC 2013 выражения формы(v,A), используемые для доступа к векторным элементам, а также(m,A), используемые для доступа к матричным элементам, не анализируются правильно. Обратный путь состоит в добавлении скобок, например(v,A()). Неизвестно, есть ли у других версий MSVC такая же проблема.
Соответствующий нешаблонный синтаксис, используемый для доступа к конкретным элементам, например(m,A31)или(v,Y), не затрагивается этой проблемой.