aboutsummaryrefslogtreecommitdiff
path: root/odb
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2013-02-11 13:20:12 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2013-02-11 13:20:12 +0200
commit7069c262c0293e634f9172e8ee57b0f018f64861 (patch)
treec948221020a00d6581e8d08eb88dcde53cdc700b /odb
parent630d56f0b21b0031d3062cfe78c026080bc98eb7 (diff)
Support compilers that deduce const arrays to const reference differently
Diffstat (limited to 'odb')
-rw-r--r--odb/sqlite/query.hxx35
1 files changed, 35 insertions, 0 deletions
diff --git a/odb/sqlite/query.hxx b/odb/sqlite/query.hxx
index d24e66a..b6d5bb9 100644
--- a/odb/sqlite/query.hxx
+++ b/odb/sqlite/query.hxx
@@ -336,6 +336,41 @@ namespace odb
return ref_bind_typed<T, ID> (x);
}
+ // Some compilers (notably VC++), when deducing const T& from const
+ // array do not strip const from the array type. As a result, in the
+ // above signatures we get, for example, T = const char[4] instead
+ // of T = char[4], which is what we want. So to "fix" such compilers,
+ // we will have to provide the following specializations of the above
+ // functions.
+ //
+ template <typename T, std::size_t N>
+ static val_bind<T[N]>
+ _val (const T (&x) [N])
+ {
+ return val_bind<T[N]> (x);
+ }
+
+ template <database_type_id ID, typename T, std::size_t N>
+ static val_bind_typed<T[N], ID>
+ _val (const T (&x) [N])
+ {
+ return val_bind_typed<T[N], ID> (x);
+ }
+
+ template <typename T, std::size_t N>
+ static ref_bind<T[N]>
+ _ref (const T (&x) [N])
+ {
+ return ref_bind<T[N]> (x);
+ }
+
+ template <database_type_id ID, typename T, std::size_t N>
+ static ref_bind_typed<T[N], ID>
+ _ref (const T (&x) [N])
+ {
+ return ref_bind_typed<T[N], ID> (x);
+ }
+
public:
query_base&
operator+= (const query_base&);