You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2021/05/25 16:16:14 UTC

[qpid-proton] branch main updated: PROTON-2387: [C++] Remove support for versions prior to C++11.

This is an automated email from the ASF dual-hosted git repository.

astitcher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/qpid-proton.git


The following commit(s) were added to refs/heads/main by this push:
     new 746838f  PROTON-2387: [C++] Remove support for versions prior to C++11.
746838f is described below

commit 746838f3508da5b426e42d2a67acaec880918368
Author: Andrew Stitcher <as...@apache.org>
AuthorDate: Thu May 20 22:15:55 2021 -0400

    PROTON-2387: [C++] Remove support for versions prior to C++11.
---
 CMakeLists.txt                                |  16 +--
 cpp/CMakeLists.txt                            |  45 +--------
 cpp/config_presets.hpp.in                     |  26 -----
 cpp/examples/CMakeLists.txt                   |  61 ++++--------
 cpp/examples/broker.cpp                       |  32 +++---
 cpp/examples/client.cpp                       |   7 +-
 cpp/examples/colour_send.cpp                  |   9 +-
 cpp/examples/connection_options.cpp           |   7 +-
 cpp/examples/direct_recv.cpp                  |   7 +-
 cpp/examples/direct_send.cpp                  |  11 +--
 cpp/examples/fake_cpp11.hpp                   |  34 -------
 cpp/examples/flow_control.cpp                 |  21 ++--
 cpp/examples/helloworld.cpp                   |   9 +-
 cpp/examples/queue_browser.cpp                |   5 +-
 cpp/examples/reconnect_client.cpp             |  11 +--
 cpp/examples/scheduled_send.cpp               |   8 +-
 cpp/examples/scheduled_send_03.cpp            |   7 +-
 cpp/examples/selected_recv.cpp                |   5 +-
 cpp/examples/server.cpp                       |   5 +-
 cpp/examples/server_direct.cpp                |   9 +-
 cpp/examples/service_bus.cpp                  |  13 ++-
 cpp/examples/simple_connect.cpp               |   5 +-
 cpp/examples/simple_recv.cpp                  |   5 +-
 cpp/examples/simple_send.cpp                  |  11 +--
 cpp/examples/ssl.cpp                          |  19 ++--
 cpp/examples/ssl_client_cert.cpp              |  15 ++-
 cpp/include/proton/codec/decoder.hpp          |   2 -
 cpp/include/proton/codec/encoder.hpp          |   2 -
 cpp/include/proton/connection_options.hpp     |   1 -
 cpp/include/proton/container.hpp              |   5 -
 cpp/include/proton/endpoint.hpp               |   5 -
 cpp/include/proton/error.hpp                  |   1 -
 cpp/include/proton/error_condition.hpp        |   5 -
 cpp/include/proton/fwd.hpp                    |   6 --
 cpp/include/proton/internal/config.hpp        | 137 --------------------------
 cpp/include/proton/internal/object.hpp        |   9 --
 cpp/include/proton/internal/pn_unique_ptr.hpp |   9 --
 cpp/include/proton/internal/type_traits.hpp   |   5 -
 cpp/include/proton/io/connection_driver.hpp   |   1 -
 cpp/include/proton/map.hpp                    |   2 -
 cpp/include/proton/message.hpp                |   2 -
 cpp/include/proton/null.hpp                   |   4 +-
 cpp/include/proton/sasl.hpp                   |   5 -
 cpp/include/proton/scalar_base.hpp            |   4 -
 cpp/include/proton/ssl.hpp                    |   5 -
 cpp/include/proton/types.hpp                  |   3 -
 cpp/include/proton/types_fwd.hpp              |   1 -
 cpp/include/proton/value.hpp                  |   5 +-
 cpp/include/proton/work_queue.hpp             |  14 ---
 cpp/src/codec_test.cpp                        |   3 -
 cpp/src/connect_config_test.cpp               |  40 ++++----
 cpp/src/connection_driver_test.cpp            |  14 +--
 cpp/src/container.cpp                         |   4 -
 cpp/src/container_test.cpp                    |  66 ++++++-------
 cpp/src/credit_test.cpp                       |  32 +++---
 cpp/src/decoder.cpp                           |   2 -
 cpp/src/delivery_test.cpp                     |  10 +-
 cpp/src/encoder.cpp                           |   2 -
 cpp/src/error_condition.cpp                   |   2 -
 cpp/src/map.cpp                               |   2 -
 cpp/src/message.cpp                           |   3 -
 cpp/src/proactor_container_impl.cpp           |  22 +----
 cpp/src/proactor_container_impl.hpp           |   7 --
 cpp/src/reconnect_test.cpp                    |  56 +++++------
 cpp/src/scalar_base.cpp                       |   4 -
 cpp/src/scalar_test.hpp                       |   3 -
 cpp/src/test_bits.hpp                         |   3 +-
 cpp/src/timestamp.cpp                         |   1 -
 cpp/src/value.cpp                             |   2 -
 cpp/src/value_test.cpp                        |   5 +-
 cpp/src/work_queue.cpp                        |   4 -
 71 files changed, 227 insertions(+), 696 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3d9bee8..cb6b15b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -86,18 +86,9 @@ if (CMAKE_CXX_COMPILER)
   if (DEFINED CMAKE_CXX_COMPILE_FEATURES)
     set(CMAKE_CXX_STANDARD 11)
     set(CMAKE_CXX_EXTENSIONS OFF)
-    # Every supported version of Visual Studio (2015 onwards) supports enough C++11 that we
-    # no longer need to run the individual feature tests
   else ()
-    include(CheckCXXCompilerFlag)
-    # These flags work with GCC/Clang/SunPro compilers
-    check_cxx_compiler_flag("-std=c++11" ACCEPTS_CXX11)
-    check_cxx_compiler_flag("-std=c++0x" ACCEPTS_CXX0X)
-    if (ACCEPTS_CXX11)
-      set(CXX_STANDARD "-std=c++11")
-    elseif(ACCEPTS_CXX0X)
-      set(CXX_STANDARD "-std=c++0x")
-    endif()
+    # This can only be a fairly old version of Linux in practice
+    set(CXX_STANDARD "-std=c++11")
   endif ()
 endif()
 
@@ -198,9 +189,6 @@ set (CC_WARNING_Clang "-Wno-unused-parameter -Wstrict-prototypes -Wvla -Wsign-co
 set (CC_WARNING_MSVC "/wd4244 /wd4267 /wd4800 /wd4996")
 
 set (CXX_WARNING_GNU "")
-# TODO aconway 2016-01-06: we should be able to clean up the code and turn on
-# some of these warnings.
-#set (CXX_WARNING_Clang "-Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-float-equal -Wno-padded -Wno-sign-conversion -Wno-switch-enum -Wno-weak-vtables -Wno-exit-time-destructors -Wno-global-constructors -Wno-shorten-64-to-32 -Wno-documentation -Wno-documentation-unknown-command -Wno-old-style-cast -Wno-missing-noreturn")
 set (CXX_WARNING_Clang "")
 set (CXX_WARNING_MSVC "")
 
diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt
index 93b409e..eba042e 100644
--- a/cpp/CMakeLists.txt
+++ b/cpp/CMakeLists.txt
@@ -25,12 +25,9 @@ find_package(Threads)
 
 include(versions.cmake)
 
-set (BUILD_CPP_03 OFF CACHE BOOL "Compile the C++ binding as C++03 even when C++11 is available")
-
 # Check for JSON-CPP support for connection configuration
 find_package(JsonCpp)
-cmake_dependent_option(ENABLE_JSONCPP "Use jsoncpp parser for connection configuration" ${JsonCpp_FOUND}
-  "NOT BUILD_CPP_03" OFF)
+option(ENABLE_JSONCPP "Use jsoncpp parser for connection configuration" ${JsonCpp_FOUND})
 if (ENABLE_JSONCPP)
   include_directories(${JsonCpp_INCLUDE_DIRS})
   set(CONNECT_CONFIG_SRC src/connect_config.cpp)
@@ -39,47 +36,8 @@ else()
   set(CONNECT_CONFIG_SRC src/connect_config_dummy.cpp)
 endif()
 
-# This effectively checks for cmake version 3.1 or later
-if (DEFINED CMAKE_CXX_COMPILE_FEATURES)
-  if (BUILD_CPP_03)
-    set(CMAKE_CXX_STANDARD 98)
-  else ()
-    set(CPP_DEFINITIONS "HAS_CPP11")
-  endif ()
-else ()
-  if (BUILD_CPP_03)
-    set(CXX_STANDARD "-std=c++98")
-  else ()
-    if (ACCEPTS_CXX11)
-      set(CPP_DEFINITIONS "HAS_CPP11")
-    else()
-      include(cpp.cmake) # Compiler checks needed as not all C++11 may be supported
-    endif()
-  endif()
-endif ()
-
 list(APPEND PLATFORM_LIBS Threads::Threads)
 
-# Construct #define lines to insert in config_presets.hpp
-foreach(d ${CPP_DEFINITIONS})
-  set(presets "${presets}#define PN_CPP_LIB_${d} 1\n")
-endforeach()
-# For Visual Studio define the app compile time macros now, for everything else don't
-if(MSVC)
-  set(presets "${presets}\n// Compiled for MSVC version ${CMAKE_CXX_COMPILER_VERSION} (${MSVC_VERSION})\n")
-  foreach(d ${CPP_DEFINITIONS})
-    set(presets "${presets}# define PN_CPP_${d} 1\n")
-  endforeach()
-else()
-  set(presets "${presets}\n#if qpid_proton_cpp_EXPORTS\n")
-  foreach(d ${CPP_DEFINITIONS})
-    set(presets "${presets}# define PN_CPP_${d} 1\n")
-  endforeach()
-  set(presets "${presets}#endif // qpid_proton_cpp_EXPORTS\n")
-endif()
-
-configure_file(config_presets.hpp.in config_presets.hpp @ONLY)
-
 set(CXX_EXAMPLE_FLAGS "${CXX_WARNING_FLAGS} ${CXX_STANDARD}")
 set(CXX_EXAMPLE_LINK_FLAGS "${SANITIZE_FLAGS}")
 
@@ -187,7 +145,6 @@ if (MSVC)
 endif (MSVC)
 
 install (DIRECTORY "include/proton" DESTINATION ${INCLUDE_INSTALL_DIR} FILES_MATCHING PATTERN "*.hpp")
-install (FILES "${CMAKE_CURRENT_BINARY_DIR}/config_presets.hpp" DESTINATION "${INCLUDE_INSTALL_DIR}/proton/internal")
 install (DIRECTORY "examples/"
   DESTINATION "${PROTON_SHARE}/examples/cpp"
   USE_SOURCE_PERMISSIONS
diff --git a/cpp/config_presets.hpp.in b/cpp/config_presets.hpp.in
deleted file mode 100644
index 676681b..0000000
--- a/cpp/config_presets.hpp.in
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifndef PROTON_INTERNAL_CONFIG_PRESETS_HPP
-#define PROTON_INTERNAL_CONFIG_PRESETS_HPP
-
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-@presets@
- #endif // PROTON_INTERNAL_CONFIG_PRESETS_HPP
\ No newline at end of file
diff --git a/cpp/examples/CMakeLists.txt b/cpp/examples/CMakeLists.txt
index 9b80b6a..7c123ce 100644
--- a/cpp/examples/CMakeLists.txt
+++ b/cpp/examples/CMakeLists.txt
@@ -42,35 +42,18 @@ if(NOT TARGET Threads::Threads)
   endif()
 endif()
 
-macro (has_cxx_features result)
-set(${result} OFF)
-if (DEFINED CMAKE_CXX_COMPILE_FEATURES)
-  set(${result} ON)
-  foreach(feature ${ARGN})
-    list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_${feature} N)
-    if (N EQUAL -1)
-      set(${result} OFF)
-      break()
-    endif()
-  endforeach()
-endif()
-endmacro()
-
-set (BUILD_CPP_03 OFF CACHE BOOL "Compile as C++03 even when C++11 is available")
 # This effectively checks for cmake version 3.1 or later
 if (DEFINED CMAKE_CXX_COMPILE_FEATURES)
-  if (BUILD_CPP_03)
-    set(STD 98)
-  else ()
-    set(STD 11)
-    has_cxx_features(HAS_ENOUGH_CPP11 lambdas variadic_templates)
-    message(STATUS "Compiling C++11 examples: ${HAS_ENOUGH_CPP11}")
-  endif ()
-  set(CMAKE_CXX_STANDARD ${STD})
+  set(CMAKE_CXX_STANDARD 11)
   set(CMAKE_CXX_EXTENSIONS OFF)
+else ()
+  # This can only be a fairly old version of Linux in practice
+  set(CXX_STANDARD "-std=c++11")
+  add_definitions(${CXX_STANDARD})
 endif()
 
-# Single-threaded examples that work on C++03
+
+# Single-threaded examples
 foreach(example
     broker
     helloworld
@@ -92,27 +75,17 @@ foreach(example
     flow_control
     ssl
     ssl_client_cert
-    encode_decode)
+    encode_decode
+    scheduled_send
+    service_bus)
   add_executable(${example} ${example}.cpp)
   target_link_libraries(${example} Proton::cpp)
 endforeach()
 
-if(HAS_ENOUGH_CPP11)
-  # Examples that require C++11
-  foreach(example
-      scheduled_send
-      service_bus)
-    add_executable(${example} ${example}.cpp)
-    target_link_libraries(${example} Proton::cpp)
-  endforeach()
-
-  # Examples that use threads directly
-  if (Threads_FOUND)
-    foreach(example
-        multithreaded_client
-        multithreaded_client_flow_control)
-      add_executable(${example} ${example}.cpp)
-      target_link_libraries(${example} Proton::cpp Threads::Threads)
-    endforeach()
-  endif()
-endif()
+# Examples that use threads directly
+foreach(example
+    multithreaded_client
+    multithreaded_client_flow_control)
+  add_executable(${example} ${example}.cpp)
+  target_link_libraries(${example} Proton::cpp Threads::Threads)
+endforeach()
diff --git a/cpp/examples/broker.cpp b/cpp/examples/broker.cpp
index b15ac39..30b6028 100644
--- a/cpp/examples/broker.cpp
+++ b/cpp/examples/broker.cpp
@@ -41,12 +41,8 @@
 #include <iostream>
 #include <map>
 #include <string>
-
-#if PN_CPP_HAS_STD_THREAD
 #include <thread>
-#endif
 
-#include "fake_cpp11.hpp"
 
 // This is a simplified model for a message broker, that only allows for
 // messages to go to a single receiver.
@@ -97,8 +93,8 @@ class Sender : public proton::messaging_handler {
     int pending_credit_;
 
     // Messaging handlers
-    void on_sendable(proton::sender &sender) OVERRIDE;
-    void on_sender_close(proton::sender &sender) OVERRIDE;
+    void on_sendable(proton::sender &sender) override;
+    void on_sender_close(proton::sender &sender) override;
 
 public:
     Sender(proton::sender s, senders& ss) :
@@ -232,7 +228,7 @@ class Receiver : public proton::messaging_handler {
     std::deque<proton::message> messages_;
 
     // A message is received.
-    void on_message(proton::delivery &, proton::message &m) OVERRIDE {
+    void on_message(proton::delivery &, proton::message &m) override {
         messages_.push_back(m);
 
         if (queue_) {
@@ -322,12 +318,12 @@ public:
         queue_manager_(qm)
     {}
 
-    void on_connection_open(proton::connection& c) OVERRIDE {
+    void on_connection_open(proton::connection& c) override {
         c.open();            // Accept the connection
     }
 
     // A sender sends messages from a queue to a subscriber.
-    void on_sender_open(proton::sender &sender) OVERRIDE {
+    void on_sender_open(proton::sender &sender) override {
         std::string qn = sender.source().dynamic() ? "" : sender.source().address();
         Sender* s = new Sender(sender, senders_);
         senders_[sender] = s;
@@ -335,13 +331,13 @@ public:
     }
 
     // A receiver receives messages from a publisher to a queue.
-    void on_receiver_open(proton::receiver &receiver) OVERRIDE {
+    void on_receiver_open(proton::receiver &receiver) override {
         std::string qname = receiver.target().address();
         Receiver* r = new Receiver(receiver);
         queue_manager_.add(make_work(&QueueManager::findQueueReceiver, &queue_manager_, r, qname));
     }
 
-    void on_session_close(proton::session &session) OVERRIDE {
+    void on_session_close(proton::session &session) override {
         // Unsubscribe all senders that belong to session.
         for (proton::sender_iterator i = session.senders().begin(); i != session.senders().end(); ++i) {
             senders::iterator j = senders_.find(*i);
@@ -354,12 +350,12 @@ public:
         }
     }
 
-    void on_error(const proton::error_condition& e) OVERRIDE {
+    void on_error(const proton::error_condition& e) override {
         std::cout << "protocol error: " << e.what() << std::endl;
     }
 
     // The container calls on_transport_close() last.
-    void on_transport_close(proton::transport& t) OVERRIDE {
+    void on_transport_close(proton::transport& t) override {
         // Unsubscribe all senders.
         for (proton::sender_iterator i = t.connection().senders().begin(); i != t.connection().senders().end(); ++i) {
             senders::iterator j = senders_.find(*i);
@@ -382,26 +378,22 @@ class broker {
     }
 
     void run() {
-#if PN_CPP_HAS_STD_THREAD
         container_.run(std::thread::hardware_concurrency());
-#else
-        container_.run();
-#endif
     }
 
   private:
     struct listener : public proton::listen_handler {
         listener(QueueManager& c) : queues_(c) {}
 
-        proton::connection_options on_accept(proton::listener&) OVERRIDE{
+        proton::connection_options on_accept(proton::listener&) override{
             return proton::connection_options().handler(*(new connection_handler(queues_)));
         }
 
-        void on_open(proton::listener& l) OVERRIDE {
+        void on_open(proton::listener& l) override {
             std::cout << "broker listening on " << l.port() << std::endl;
         }
 
-        void on_error(proton::listener&, const std::string& s) OVERRIDE {
+        void on_error(proton::listener&, const std::string& s) override {
             std::cerr << "listen error: " << s << std::endl;
             throw std::runtime_error(s);
         }
diff --git a/cpp/examples/client.cpp b/cpp/examples/client.cpp
index a9d5dbe..1699c2d 100644
--- a/cpp/examples/client.cpp
+++ b/cpp/examples/client.cpp
@@ -32,7 +32,6 @@
 #include <iostream>
 #include <vector>
 
-#include "fake_cpp11.hpp"
 
 using proton::receiver_options;
 using proton::source_options;
@@ -47,7 +46,7 @@ class client : public proton::messaging_handler {
   public:
     client(const std::string &u, const std::vector<std::string>& r) : url(u), requests(r) {}
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         sender = c.open_sender(url);
         // Create a receiver requesting a dynamically created queue
         // for the message source.
@@ -62,11 +61,11 @@ class client : public proton::messaging_handler {
         sender.send(req);
     }
 
-    void on_receiver_open(proton::receiver &) OVERRIDE {
+    void on_receiver_open(proton::receiver &) override {
         send_request();
     }
 
-    void on_message(proton::delivery &d, proton::message &response) OVERRIDE {
+    void on_message(proton::delivery &d, proton::message &response) override {
         if (requests.empty()) return; // Spurious extra message!
 
         std::cout << requests.front() << " => " << response.body() << std::endl;
diff --git a/cpp/examples/colour_send.cpp b/cpp/examples/colour_send.cpp
index 107b600..76cdaca 100644
--- a/cpp/examples/colour_send.cpp
+++ b/cpp/examples/colour_send.cpp
@@ -34,7 +34,6 @@
 #include <sstream>
 #include <map>
 
-#include "fake_cpp11.hpp"
 
 class colour_send : public proton::messaging_handler {
   private:
@@ -50,14 +49,14 @@ class colour_send : public proton::messaging_handler {
     colour_send(const std::string &s, const std::string &u, const std::string &p, int c) :
         url(s), user(u), password(p), sent(0), confirmed(0), total(c) {}
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         proton::connection_options co;
         if (!user.empty()) co.user(user);
         if (!password.empty()) co.password(password);
         sender = c.open_sender(url, co);
     }
 
-    void on_sendable(proton::sender &s) OVERRIDE {
+    void on_sendable(proton::sender &s) override {
         while (s.credit() && sent < total) {
             proton::message msg;
 
@@ -73,7 +72,7 @@ class colour_send : public proton::messaging_handler {
         }
     }
 
-    void on_tracker_accept(proton::tracker &t) OVERRIDE {
+    void on_tracker_accept(proton::tracker &t) override {
         confirmed++;
 
         if (confirmed == total) {
@@ -82,7 +81,7 @@ class colour_send : public proton::messaging_handler {
         }
     }
 
-    void on_transport_close(proton::transport &) OVERRIDE {
+    void on_transport_close(proton::transport &) override {
         sent = confirmed;
     }
 };
diff --git a/cpp/examples/connection_options.cpp b/cpp/examples/connection_options.cpp
index df26100..bf8a50f 100644
--- a/cpp/examples/connection_options.cpp
+++ b/cpp/examples/connection_options.cpp
@@ -29,10 +29,9 @@
 
 using proton::connection_options;
 
-#include "fake_cpp11.hpp"
 
 class handler_2 : public proton::messaging_handler {
-    void on_connection_open(proton::connection &c) OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         std::cout << "connection events going to handler_2" << std::endl;
         std::cout << "connection max_frame_size: " << c.max_frame_size() <<
             ", idle timeout: " << c.idle_timeout() << std::endl;
@@ -48,13 +47,13 @@ class main_handler : public proton::messaging_handler {
   public:
     main_handler(const std::string& u) : url(u) {}
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         // Connection options for this connection.  Merged with and overriding the container's
         // client_connection_options() settings.
         c.connect(url, connection_options().handler(conn_handler).max_frame_size(2468));
     }
 
-    void on_connection_open(proton::connection &c) OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         std::cout << "unexpected connection event on main handler" << std::endl;
         c.close();
     }
diff --git a/cpp/examples/direct_recv.cpp b/cpp/examples/direct_recv.cpp
index 93ba06f..d6671f9 100644
--- a/cpp/examples/direct_recv.cpp
+++ b/cpp/examples/direct_recv.cpp
@@ -35,12 +35,11 @@
 #include <iostream>
 #include <map>
 
-#include "fake_cpp11.hpp"
 
 class direct_recv : public proton::messaging_handler {
   private:
     class listener_ready_handler : public proton::listen_handler {
-        void on_open(proton::listener& l) OVERRIDE {
+        void on_open(proton::listener& l) override {
             std::cout << "listening on " << l.port() << std::endl;
         }
     };
@@ -54,11 +53,11 @@ class direct_recv : public proton::messaging_handler {
   public:
     direct_recv(const std::string &s, int c) : url(s), expected(c), received(0) {}
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         listener = c.listen(url, listen_handler);
     }
 
-    void on_message(proton::delivery &d, proton::message &msg) OVERRIDE {
+    void on_message(proton::delivery &d, proton::message &msg) override {
         if (proton::coerce<int>(msg.id()) < received) {
             return; // Ignore duplicate
         }
diff --git a/cpp/examples/direct_send.cpp b/cpp/examples/direct_send.cpp
index 79be34c..3db2086 100644
--- a/cpp/examples/direct_send.cpp
+++ b/cpp/examples/direct_send.cpp
@@ -35,12 +35,11 @@
 #include <iostream>
 #include <map>
 
-#include "fake_cpp11.hpp"
 
 class simple_send : public proton::messaging_handler {
   private:
     class listener_ready_handler : public proton::listen_handler {
-        void on_open(proton::listener& l) OVERRIDE {
+        void on_open(proton::listener& l) override {
             std::cout << "listening on " << l.port() << std::endl;
         }
     };
@@ -55,11 +54,11 @@ class simple_send : public proton::messaging_handler {
   public:
     simple_send(const std::string &s, int c) : url(s), sent(0), confirmed(0), total(c) {}
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         listener = c.listen(url, listen_handler);
     }
 
-    void on_sendable(proton::sender &sender) OVERRIDE {
+    void on_sendable(proton::sender &sender) override {
         while (sender.credit() && sent < total) {
             proton::message msg;
             std::map<std::string, int> m;
@@ -73,7 +72,7 @@ class simple_send : public proton::messaging_handler {
         }
     }
 
-    void on_tracker_accept(proton::tracker &t) OVERRIDE {
+    void on_tracker_accept(proton::tracker &t) override {
         confirmed++;
 
         if (confirmed == total) {
@@ -83,7 +82,7 @@ class simple_send : public proton::messaging_handler {
         }
     }
 
-    void on_transport_close(proton::transport &) OVERRIDE {
+    void on_transport_close(proton::transport &) override {
         sent = confirmed;
     }
 };
diff --git a/cpp/examples/fake_cpp11.hpp b/cpp/examples/fake_cpp11.hpp
deleted file mode 100644
index 03daa3b..0000000
--- a/cpp/examples/fake_cpp11.hpp
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef FAKE_CPP11_HPP
-#define FAKE_CPP11_HPP
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/// These definitions allow us to use some new C++11 features in previous compilers
-///
-/// It is strongly recommended not to copy this - just use C++11/C++14 instead!
-
-#if __cplusplus < 201103L
-#define OVERRIDE
-#else
-#define OVERRIDE override
-#endif
-
-
-#endif // FAKE_CPP11_HPP
diff --git a/cpp/examples/flow_control.cpp b/cpp/examples/flow_control.cpp
index c74070c..566c640 100644
--- a/cpp/examples/flow_control.cpp
+++ b/cpp/examples/flow_control.cpp
@@ -36,7 +36,6 @@
 #include <iostream>
 #include <sstream>
 
-#include "fake_cpp11.hpp"
 
 namespace {
 
@@ -72,14 +71,14 @@ class flow_sender : public proton::messaging_handler {
         }
     }
 
-    void on_sendable(proton::sender &s) OVERRIDE {
+    void on_sendable(proton::sender &s) override {
         if (verbose)
             std::cout << "flow_sender in \"on_sendable\" with credit " << s.credit()
                       << " and " << available << " available messages" << std::endl;
         send_available_messages(s);
     }
 
-    void on_sender_drain_start(proton::sender &s) OVERRIDE {
+    void on_sender_drain_start(proton::sender &s) override {
         if (verbose)
             std::cout << "flow_sender in \"on_drain_start\" with credit " << s.credit()
                       << " and " << available << " available messages" << std::endl;
@@ -174,11 +173,11 @@ class flow_receiver : public proton::messaging_handler {
         stage++;
     }
 
-    void on_receiver_open(proton::receiver &r) OVERRIDE {
+    void on_receiver_open(proton::receiver &r) override {
         run_stage(r, "on_receiver_open");
     }
 
-    void on_message(proton::delivery &d, proton::message &m) OVERRIDE {
+    void on_message(proton::delivery &d, proton::message &m) override {
         if (verbose)
             std::cout << "flow_receiver in \"on_message\" with " << m.body() << std::endl;
         proton::receiver r(d.receiver());
@@ -186,7 +185,7 @@ class flow_receiver : public proton::messaging_handler {
         run_stage(r, "on_message");
     }
 
-    void on_receiver_drain_finish(proton::receiver &r) OVERRIDE {
+    void on_receiver_drain_finish(proton::receiver &r) override {
         if (verbose)
             std::cout << "flow_receiver in \"on_receiver_drain_finish\"" << std::endl;
         run_stage(r, "on_receiver_drain_finish");
@@ -200,13 +199,13 @@ class flow_listener : public proton::listen_handler {
         opts.handler(sh);
     }
 
-    void on_open(proton::listener& l) OVERRIDE {
+    void on_open(proton::listener& l) override {
         std::ostringstream url;
         url << "//:" << l.port() << "/example"; // Connect to the actual listening port
         l.container().connect(url.str());
     }
 
-    proton::connection_options on_accept(proton::listener&) OVERRIDE { return opts; }
+    proton::connection_options on_accept(proton::listener&) override { return opts; }
 };
 
 class flow_control : public proton::messaging_handler {
@@ -219,19 +218,19 @@ class flow_control : public proton::messaging_handler {
   public:
     flow_control() : receive_handler(send_handler), listen_handler(send_handler) {}
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         // Listen on a dynamic port on the local host.
         listener = c.listen("//:0", listen_handler);
     }
 
-    void on_connection_open(proton::connection &c) OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         if (c.active()) {
             // outbound connection
             c.open_receiver("flow_example", proton::receiver_options().handler(receive_handler).credit_window(0));
         }
     }
 
-    void on_connection_close(proton::connection &) OVERRIDE {
+    void on_connection_close(proton::connection &) override {
         listener.stop();
     }
 };
diff --git a/cpp/examples/helloworld.cpp b/cpp/examples/helloworld.cpp
index 5962826..31ac0e3 100644
--- a/cpp/examples/helloworld.cpp
+++ b/cpp/examples/helloworld.cpp
@@ -28,7 +28,6 @@
 
 #include <iostream>
 
-#include "fake_cpp11.hpp"
 
 class hello_world : public proton::messaging_handler {
     std::string conn_url_;
@@ -38,22 +37,22 @@ class hello_world : public proton::messaging_handler {
     hello_world(const std::string& u, const std::string& a) :
         conn_url_(u), addr_(a) {}
 
-    void on_container_start(proton::container& c) OVERRIDE {
+    void on_container_start(proton::container& c) override {
         c.connect(conn_url_);
     }
 
-    void on_connection_open(proton::connection& c) OVERRIDE {
+    void on_connection_open(proton::connection& c) override {
         c.open_receiver(addr_);
         c.open_sender(addr_);
     }
 
-    void on_sendable(proton::sender &s) OVERRIDE {
+    void on_sendable(proton::sender &s) override {
         proton::message m("Hello World!");
         s.send(m);
         s.close();
     }
 
-    void on_message(proton::delivery &d, proton::message &m) OVERRIDE {
+    void on_message(proton::delivery &d, proton::message &m) override {
         std::cout << m.body() << std::endl;
         d.connection().close();
     }
diff --git a/cpp/examples/queue_browser.cpp b/cpp/examples/queue_browser.cpp
index b306e76..aaed4c6 100644
--- a/cpp/examples/queue_browser.cpp
+++ b/cpp/examples/queue_browser.cpp
@@ -29,7 +29,6 @@
 
 #include <iostream>
 
-#include "fake_cpp11.hpp"
 
 class queue_browser : public proton::messaging_handler {
     std::string conn_url_;
@@ -39,7 +38,7 @@ class queue_browser : public proton::messaging_handler {
     queue_browser(const std::string& u, const std::string& a) :
         conn_url_(u), addr_(a) {}
 
-    void on_container_start(proton::container& c) OVERRIDE {
+    void on_container_start(proton::container& c) override {
         proton::receiver_options ropts;
         proton::source_options sopts;
         ropts.source(sopts.distribution_mode(proton::source::COPY));
@@ -48,7 +47,7 @@ class queue_browser : public proton::messaging_handler {
         conn.open_receiver(addr_, ropts);
     }
 
-    void on_message(proton::delivery&, proton::message& m) OVERRIDE {
+    void on_message(proton::delivery&, proton::message& m) override {
         std::cout << m.body() << std::endl;
     }
 };
diff --git a/cpp/examples/reconnect_client.cpp b/cpp/examples/reconnect_client.cpp
index ed93214..5ec0e01 100644
--- a/cpp/examples/reconnect_client.cpp
+++ b/cpp/examples/reconnect_client.cpp
@@ -37,7 +37,6 @@
 #include <map>
 #include <string>
 
-#include "fake_cpp11.hpp"
 
 class reconnect_client : public proton::messaging_handler {
     std::string url;
@@ -53,7 +52,7 @@ class reconnect_client : public proton::messaging_handler {
         url(u), address(a), failovers(f), sent(0), expected(c), received(0) {}
 
   private:
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         proton::connection_options co;
         proton::reconnect_options ro;
 
@@ -62,7 +61,7 @@ class reconnect_client : public proton::messaging_handler {
         c.connect(url, co);
     }
 
-    void on_connection_open(proton::connection & c) OVERRIDE {
+    void on_connection_open(proton::connection & c) override {
         c.open_receiver(address);
         c.open_sender(address);
         // reconnect we probably lost the last message sent
@@ -70,7 +69,7 @@ class reconnect_client : public proton::messaging_handler {
         std::cout << "simple_recv listening on " << url << std::endl;
     }
 
-    void on_message(proton::delivery &d, proton::message &msg) OVERRIDE {
+    void on_message(proton::delivery &d, proton::message &msg) override {
         if (proton::coerce<int>(msg.id()) < received) {
             return; // Ignore duplicate
         }
@@ -106,11 +105,11 @@ class reconnect_client : public proton::messaging_handler {
         }
     }
 
-    void on_sender_open(proton::sender & s) OVERRIDE {
+    void on_sender_open(proton::sender & s) override {
         sender = s;
     }
 
-    void on_sendable(proton::sender &s) OVERRIDE {
+    void on_sendable(proton::sender &s) override {
         send(s);
     }
 };
diff --git a/cpp/examples/scheduled_send.cpp b/cpp/examples/scheduled_send.cpp
index 3244540..feda819 100644
--- a/cpp/examples/scheduled_send.cpp
+++ b/cpp/examples/scheduled_send.cpp
@@ -31,8 +31,6 @@
 
 #include <iostream>
 
-#include "fake_cpp11.hpp"
-
 // Send messages at a constant rate one per interval. cancel after a timeout.
 class scheduled_sender : public proton::messaging_handler {
   private:
@@ -55,11 +53,11 @@ class scheduled_sender : public proton::messaging_handler {
 
     // The awkward looking double lambda is necessary because the scheduled lambdas run in the container context
     // and must arrange lambdas for send and close to happen in the connection context.
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         c.open_sender(url);
     }
 
-    void on_sender_open(proton::sender &s) OVERRIDE {
+    void on_sender_open(proton::sender &s) override {
         sender = s;
         work_queue = &s.work_queue();
         // Call this->cancel after timeout.
@@ -83,7 +81,7 @@ class scheduled_sender : public proton::messaging_handler {
             ready = true;  // Set the ready flag, send as soon as we get credit.
     }
 
-    void on_sendable(proton::sender &) OVERRIDE {
+    void on_sendable(proton::sender &) override {
         if (ready)              // We have been ticked since the last send.
             send();
     }
diff --git a/cpp/examples/scheduled_send_03.cpp b/cpp/examples/scheduled_send_03.cpp
index 9050429..edd6ef7 100644
--- a/cpp/examples/scheduled_send_03.cpp
+++ b/cpp/examples/scheduled_send_03.cpp
@@ -32,7 +32,6 @@
 
 #include <iostream>
 
-#include "fake_cpp11.hpp"
 
 // Send messages at a constant rate one per interval. cancel after a timeout.
 // This example uses only C++03 features.
@@ -53,11 +52,11 @@ class scheduled_sender : public proton::messaging_handler {
         canceled(false)         // Canceled.
     {}
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         c.open_sender(url);
     }
 
-    void on_sender_open(proton::sender & s) OVERRIDE {
+    void on_sender_open(proton::sender & s) override {
         work_queue = &s.work_queue();
 
         work_queue->schedule(timeout, make_work(&scheduled_sender::cancel, this, s));
@@ -79,7 +78,7 @@ class scheduled_sender : public proton::messaging_handler {
         }
     }
 
-    void on_sendable(proton::sender &sender) OVERRIDE {
+    void on_sendable(proton::sender &sender) override {
         if (ready)              // We have been ticked since the last send.
             send(sender);
     }
diff --git a/cpp/examples/selected_recv.cpp b/cpp/examples/selected_recv.cpp
index a7f9cea..0a39347 100644
--- a/cpp/examples/selected_recv.cpp
+++ b/cpp/examples/selected_recv.cpp
@@ -28,7 +28,6 @@
 
 #include <iostream>
 
-#include "fake_cpp11.hpp"
 
 namespace {
 
@@ -61,14 +60,14 @@ class selected_recv : public proton::messaging_handler {
     selected_recv(const std::string& u, const std::string& a) :
         conn_url_(u), addr_(a) {}
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         proton::source_options opts;
         set_filter(opts, "colour = 'green'");
         proton::connection conn = c.connect(conn_url_);
         conn.open_receiver(addr_, proton::receiver_options().source(opts));
     }
 
-    void on_message(proton::delivery &, proton::message &m) OVERRIDE {
+    void on_message(proton::delivery &, proton::message &m) override {
         std::cout << m.body() << std::endl;
     }
 };
diff --git a/cpp/examples/server.cpp b/cpp/examples/server.cpp
index 8e177df..08282f1 100644
--- a/cpp/examples/server.cpp
+++ b/cpp/examples/server.cpp
@@ -30,7 +30,6 @@
 #include <string>
 #include <cctype>
 
-#include "fake_cpp11.hpp"
 
 class server : public proton::messaging_handler {
     std::string conn_url_;
@@ -42,7 +41,7 @@ class server : public proton::messaging_handler {
     server(const std::string& u, const std::string& a) :
         conn_url_(u), addr_(a) {}
 
-    void on_container_start(proton::container& c) OVERRIDE {
+    void on_container_start(proton::container& c) override {
         conn_ = c.connect(conn_url_);
         conn_.open_receiver(addr_);
 
@@ -60,7 +59,7 @@ class server : public proton::messaging_handler {
         return uc;
     }
 
-    void on_message(proton::delivery&, proton::message& m) OVERRIDE {
+    void on_message(proton::delivery&, proton::message& m) override {
         std::cout << "Received " << m.body() << std::endl;
 
         std::string reply_to = m.reply_to();
diff --git a/cpp/examples/server_direct.cpp b/cpp/examples/server_direct.cpp
index d46fc29..bf7a28b 100644
--- a/cpp/examples/server_direct.cpp
+++ b/cpp/examples/server_direct.cpp
@@ -38,12 +38,11 @@
 #include <sstream>
 #include <cctype>
 
-#include "fake_cpp11.hpp"
 
 class server : public proton::messaging_handler {
   private:
     class listener_ready_handler : public proton::listen_handler {
-        void on_open(proton::listener& l) OVERRIDE {
+        void on_open(proton::listener& l) override {
             std::cout << "listening on " << l.port() << std::endl;
         }
     };
@@ -57,7 +56,7 @@ class server : public proton::messaging_handler {
   public:
     server(const std::string &u) : url(u), address_counter(0) {}
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         c.listen(url, listen_handler);
     }
 
@@ -78,7 +77,7 @@ class server : public proton::messaging_handler {
         return addr.str();
     }
 
-    void on_sender_open(proton::sender &sender) OVERRIDE {
+    void on_sender_open(proton::sender &sender) override {
         if (sender.source().dynamic()) {
             std::string addr = generate_address();
             sender.open(proton::sender_options().source(proton::source_options().address(addr)));
@@ -86,7 +85,7 @@ class server : public proton::messaging_handler {
         }
     }
 
-    void on_message(proton::delivery &, proton::message &m) OVERRIDE {
+    void on_message(proton::delivery &, proton::message &m) override {
         std::cout << "Received " << m.body() << std::endl;
 
         std::string reply_to = m.reply_to();
diff --git a/cpp/examples/service_bus.cpp b/cpp/examples/service_bus.cpp
index f10bfa7..7c25095 100644
--- a/cpp/examples/service_bus.cpp
+++ b/cpp/examples/service_bus.cpp
@@ -99,7 +99,6 @@ Done. No more messages.
 #include <iostream>
 #include <sstream>
 
-#include "fake_cpp11.hpp"
 
 using proton::source_options;
 using proton::connection_options;
@@ -152,7 +151,7 @@ class session_receiver : public proton::messaging_handler {
         container = &c;
     }
 
-    void on_connection_open(proton::connection &connection) OVERRIDE {
+    void on_connection_open(proton::connection &connection) override {
         proton::source::filter_map sb_filter_map;
         proton::symbol key("com.microsoft:session-filter");
         sb_filter_map.put(key, session_identifier);
@@ -167,7 +166,7 @@ class session_receiver : public proton::messaging_handler {
         connection.work_queue().schedule(read_timeout, [this]() { this->process_timeout(); });
     }
 
-    void on_receiver_open(proton::receiver &r) OVERRIDE {
+    void on_receiver_open(proton::receiver &r) override {
         if (closed) return; // PROTON-1264
         proton::value actual_session_id = r.source().filters().get("com.microsoft:session-filter");
         std::cout << "receiving messages with session identifier \"" << actual_session_id
@@ -175,7 +174,7 @@ class session_receiver : public proton::messaging_handler {
         last_read = proton::timestamp::now();
     }
 
-    void on_message(proton::delivery &, proton::message &m) OVERRIDE {
+    void on_message(proton::delivery &, proton::message &m) override {
         message_count++;
         std::cout << "   received message: " << m.body() << std::endl;
         last_read = proton::timestamp::now();
@@ -241,11 +240,11 @@ class session_sender : public proton::messaging_handler {
         }
     }
 
-    void on_sendable(proton::sender &s) OVERRIDE {
+    void on_sendable(proton::sender &s) override {
         send_remaining_messages(s);
     }
 
-    void on_tracker_accept(proton::tracker &t) OVERRIDE {
+    void on_tracker_accept(proton::tracker &t) override {
         accepts++;
         if (accepts == total) {
             // upload complete
@@ -274,7 +273,7 @@ class sequence : public proton::messaging_handler {
         the_sequence = this;
     }
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         container = &c;
         next_sequence();
     }
diff --git a/cpp/examples/simple_connect.cpp b/cpp/examples/simple_connect.cpp
index a9d6d4c..3821683 100644
--- a/cpp/examples/simple_connect.cpp
+++ b/cpp/examples/simple_connect.cpp
@@ -29,7 +29,6 @@
 
 #include <iostream>
 
-#include "fake_cpp11.hpp"
 
 class simple_connect : public proton::messaging_handler {
   private:
@@ -48,7 +47,7 @@ class simple_connect : public proton::messaging_handler {
         url(a), user(u), password(p),
         reconnect(r), sasl(s), mechs(ms), insecure(in) {}
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         proton::connection_options co;
         if (!user.empty()) co.user(user);
         if (!password.empty()) co.password(password);
@@ -67,7 +66,7 @@ class simple_connect : public proton::messaging_handler {
         connection = c.connect(url, co);
     }
 
-    void on_connection_open(proton::connection &c) OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         if (!reconnect) c.close();
     }
 };
diff --git a/cpp/examples/simple_recv.cpp b/cpp/examples/simple_recv.cpp
index 09a39e5..0dadf75 100644
--- a/cpp/examples/simple_recv.cpp
+++ b/cpp/examples/simple_recv.cpp
@@ -34,7 +34,6 @@
 #include <iostream>
 #include <map>
 
-#include "fake_cpp11.hpp"
 
 class simple_recv : public proton::messaging_handler {
   private:
@@ -49,14 +48,14 @@ class simple_recv : public proton::messaging_handler {
     simple_recv(const std::string &s, const std::string &u, const std::string &p, int c) :
         url(s), user(u), password(p), expected(c), received(0) {}
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         proton::connection_options co;
         if (!user.empty()) co.user(user);
         if (!password.empty()) co.password(password);
         receiver = c.open_receiver(url, co);
     }
 
-    void on_message(proton::delivery &d, proton::message &msg) OVERRIDE {
+    void on_message(proton::delivery &d, proton::message &msg) override {
         if (!msg.id().empty() && proton::coerce<int>(msg.id()) < received) {
             return; // Ignore if no id or duplicate
         }
diff --git a/cpp/examples/simple_send.cpp b/cpp/examples/simple_send.cpp
index 21cc67f..89382e9 100644
--- a/cpp/examples/simple_send.cpp
+++ b/cpp/examples/simple_send.cpp
@@ -34,7 +34,6 @@
 #include <iostream>
 #include <map>
 
-#include "fake_cpp11.hpp"
 
 class simple_send : public proton::messaging_handler {
   private:
@@ -51,7 +50,7 @@ class simple_send : public proton::messaging_handler {
     simple_send(const std::string &s, const std::string &u, const std::string &p, bool r, int c) :
         url(s), user(u), password(p), reconnect(r), sent(0), confirmed(0), total(c) {}
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         proton::connection_options co;
         if (!user.empty()) co.user(user);
         if (!password.empty()) co.password(password);
@@ -59,13 +58,13 @@ class simple_send : public proton::messaging_handler {
         sender = c.open_sender(url, co);
     }
 
-    void on_connection_open(proton::connection& c) OVERRIDE {
+    void on_connection_open(proton::connection& c) override {
         if (c.reconnected()) {
             sent = confirmed;   // Re-send unconfirmed messages after a reconnect
         }
     }
 
-    void on_sendable(proton::sender &s) OVERRIDE {
+    void on_sendable(proton::sender &s) override {
         while (s.credit() && sent < total) {
             proton::message msg;
             std::map<std::string, int> m;
@@ -79,7 +78,7 @@ class simple_send : public proton::messaging_handler {
         }
     }
 
-    void on_tracker_accept(proton::tracker &t) OVERRIDE {
+    void on_tracker_accept(proton::tracker &t) override {
         confirmed++;
 
         if (confirmed == total) {
@@ -88,7 +87,7 @@ class simple_send : public proton::messaging_handler {
         }
     }
 
-    void on_transport_close(proton::transport &) OVERRIDE {
+    void on_transport_close(proton::transport &) override {
         sent = confirmed;
     }
 };
diff --git a/cpp/examples/ssl.cpp b/cpp/examples/ssl.cpp
index 0112605..7274c9b 100644
--- a/cpp/examples/ssl.cpp
+++ b/cpp/examples/ssl.cpp
@@ -35,7 +35,6 @@
 
 #include <iostream>
 
-#include "fake_cpp11.hpp"
 
 using proton::connection_options;
 using proton::ssl_client_options;
@@ -60,7 +59,7 @@ namespace {
 struct server_handler : public proton::messaging_handler {
     proton::listener listener;
 
-    void on_connection_open(proton::connection &c) OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         std::cout << "Inbound server connection connected via SSL.  Protocol: " <<
             c.transport().ssl().protocol() << std::endl;
         listener.stop();  // Just expecting the one connection.
@@ -69,11 +68,11 @@ struct server_handler : public proton::messaging_handler {
         messaging_handler::on_connection_open(c);
     }
 
-    void on_transport_error(proton::transport &t) OVERRIDE {
+    void on_transport_error(proton::transport &t) override {
         listener.stop();
     }
 
-    void on_message(proton::delivery &, proton::message &m) OVERRIDE {
+    void on_message(proton::delivery &, proton::message &m) override {
         std::cout << m.body() << std::endl;
     }
 };
@@ -82,7 +81,7 @@ struct server_handler : public proton::messaging_handler {
 class hello_world_direct : public proton::messaging_handler {
   private:
     class listener_open_handler : public proton::listen_handler {
-        void on_open(proton::listener& l) OVERRIDE {
+        void on_open(proton::listener& l) override {
             std::ostringstream url;
             url << "//:" << l.port() << "/example"; // Connect to the actual port
             l.container().open_sender(url.str());
@@ -93,7 +92,7 @@ class hello_world_direct : public proton::messaging_handler {
     server_handler s_handler;
 
   public:
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         // Configure listener.  Details vary by platform.
         ssl_certificate server_cert = platform_certificate("tserver", "tserverpw");
         ssl_server_options ssl_srv(server_cert);
@@ -126,13 +125,13 @@ class hello_world_direct : public proton::messaging_handler {
         s_handler.listener = c.listen("//:0", listen_handler); // Listen on port 0 for a dynamic port
     }
 
-    void on_connection_open(proton::connection &c) OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         std::string subject = c.transport().ssl().remote_subject();
         std::cout << "Outgoing client connection connected via SSL.  Server certificate identity " <<
             find_CN(subject) << std::endl;
     }
 
-    void on_transport_error(proton::transport &t) OVERRIDE {
+    void on_transport_error(proton::transport &t) override {
         std::string err = t.error().what();
         if (verify == verify_fail && err.find("certificate") != std::string::npos) {
             std::cout << "Expected failure of connection with wrong peer name: " << err
@@ -142,14 +141,14 @@ class hello_world_direct : public proton::messaging_handler {
         }
     }
 
-    void on_sendable(proton::sender &s) OVERRIDE {
+    void on_sendable(proton::sender &s) override {
         proton::message m;
         m.body("Hello World!");
         s.send(m);
         s.close();
     }
 
-    void on_tracker_accept(proton::tracker &t) OVERRIDE {
+    void on_tracker_accept(proton::tracker &t) override {
         // All done.
         t.connection().close();
     }
diff --git a/cpp/examples/ssl_client_cert.cpp b/cpp/examples/ssl_client_cert.cpp
index 8c92abf..6b1eaa6 100644
--- a/cpp/examples/ssl_client_cert.cpp
+++ b/cpp/examples/ssl_client_cert.cpp
@@ -34,7 +34,6 @@
 #include <iostream>
 #include <sstream>
 
-#include "fake_cpp11.hpp"
 
 using proton::connection_options;
 using proton::ssl_client_options;
@@ -53,7 +52,7 @@ static std::string find_CN(const std::string &);
 struct server_handler : public proton::messaging_handler {
     proton::listener listener;
 
-    void on_connection_open(proton::connection &c) OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         std::cout << "Inbound server connection connected via SSL.  Protocol: " <<
             c.transport().ssl().protocol() << std::endl;
         if (c.transport().sasl().outcome() == sasl::OK) {
@@ -70,7 +69,7 @@ struct server_handler : public proton::messaging_handler {
         messaging_handler::on_connection_open(c);
     }
 
-    void on_message(proton::delivery &, proton::message &m) OVERRIDE {
+    void on_message(proton::delivery &, proton::message &m) override {
         std::cout << m.body() << std::endl;
     }
 };
@@ -79,7 +78,7 @@ struct server_handler : public proton::messaging_handler {
 class hello_world_direct : public proton::messaging_handler {
   private:
     class listener_open_handler : public proton::listen_handler {
-        void on_open(proton::listener& l) OVERRIDE {
+        void on_open(proton::listener& l) override {
             std::ostringstream url;
             url << "//:" << l.port() << "/example"; // Connect to the actual port
             l.container().open_sender(url.str());
@@ -91,7 +90,7 @@ class hello_world_direct : public proton::messaging_handler {
 
   public:
 
-    void on_container_start(proton::container &c) OVERRIDE {
+    void on_container_start(proton::container &c) override {
         // Configure listener.  Details vary by platform.
         ssl_certificate server_cert = platform_certificate("tserver", "tserverpw");
         std::string client_CA = platform_CA("tclient");
@@ -115,20 +114,20 @@ class hello_world_direct : public proton::messaging_handler {
         s_handler.listener = c.listen("//:0", listen_handler);
     }
 
-    void on_connection_open(proton::connection &c) OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         std::string subject = c.transport().ssl().remote_subject();
         std::cout << "Outgoing client connection connected via SSL.  Server certificate identity " <<
             find_CN(subject) << std::endl;
     }
 
-    void on_sendable(proton::sender &s) OVERRIDE {
+    void on_sendable(proton::sender &s) override {
         proton::message m;
         m.body("Hello World!");
         s.send(m);
         s.close();
     }
 
-    void on_tracker_accept(proton::tracker &t) OVERRIDE {
+    void on_tracker_accept(proton::tracker &t) override {
         // All done.
         t.connection().close();
     }
diff --git a/cpp/include/proton/codec/decoder.hpp b/cpp/include/proton/codec/decoder.hpp
index 243d105..82c1baa 100644
--- a/cpp/include/proton/codec/decoder.hpp
+++ b/cpp/include/proton/codec/decoder.hpp
@@ -113,9 +113,7 @@ class decoder : public internal::data {
     PN_CPP_EXTERN decoder& operator>>(scalar&);
     PN_CPP_EXTERN decoder& operator>>(internal::value_base&);
     PN_CPP_EXTERN decoder& operator>>(null&);
-#if PN_CPP_HAS_NULLPTR
     PN_CPP_EXTERN decoder& operator>>(decltype(nullptr)&);
-#endif
     ///@}
 
     /// Start decoding a container type, such as an ARRAY, LIST or
diff --git a/cpp/include/proton/codec/encoder.hpp b/cpp/include/proton/codec/encoder.hpp
index 961695e..1c67fd7 100644
--- a/cpp/include/proton/codec/encoder.hpp
+++ b/cpp/include/proton/codec/encoder.hpp
@@ -97,9 +97,7 @@ class encoder : public internal::data {
     PN_CPP_EXTERN encoder& operator<<(const binary&);
     PN_CPP_EXTERN encoder& operator<<(const scalar_base&);
     PN_CPP_EXTERN encoder& operator<<(const null&);
-#if PN_CPP_HAS_NULLPTR
     PN_CPP_EXTERN encoder& operator<<(decltype(nullptr));
-#endif
     /// @}
 
     /// Insert a proton::value.
diff --git a/cpp/include/proton/connection_options.hpp b/cpp/include/proton/connection_options.hpp
index 02d0ff6..a4d35d5 100644
--- a/cpp/include/proton/connection_options.hpp
+++ b/cpp/include/proton/connection_options.hpp
@@ -24,7 +24,6 @@
 
 #include "./duration.hpp"
 #include "./fwd.hpp"
-#include "./internal/config.hpp"
 #include "./internal/export.hpp"
 #include "./internal/pn_unique_ptr.hpp"
 #include "./symbol.hpp"
diff --git a/cpp/include/proton/container.hpp b/cpp/include/proton/container.hpp
index aa735f4..eafcde7 100644
--- a/cpp/include/proton/container.hpp
+++ b/cpp/include/proton/container.hpp
@@ -26,7 +26,6 @@
 #include "./returned.hpp"
 #include "./types_fwd.hpp"
 
-#include "./internal/config.hpp"
 #include "./internal/export.hpp"
 #include "./internal/pn_unique_ptr.hpp"
 
@@ -161,7 +160,6 @@ class PN_CPP_CLASS_EXTERN container {
     /// `run(int count)`.
     PN_CPP_EXTERN void run();
 
-#if PN_CPP_SUPPORTS_THREADS
     /// Run the container with a pool of `count` threads, including the current thread.
     ///
     /// **C++ versions** - Available with C++11 or later.
@@ -169,7 +167,6 @@ class PN_CPP_CLASS_EXTERN container {
     /// The call returns when the container stops. See `auto_stop()`
     /// and `stop()`.
     PN_CPP_EXTERN void run(int count);
-#endif
 
     /// Enable or disable automatic container stop.  It is enabled by
     /// default.
@@ -314,9 +311,7 @@ class PN_CPP_CLASS_EXTERN container {
   private:
     /// Declare both v03 and v11 if compiling with c++11 as the library contains both.
     /// A C++11 user should never call the v03 overload so it is private in this case
-#if PN_CPP_HAS_LAMBDAS && PN_CPP_HAS_VARIADIC_TEMPLATES
     PN_CPP_EXTERN void schedule(duration dur, internal::v03::work fn);
-#endif
     class impl;
     internal::pn_unique_ptr<impl> impl_;
 
diff --git a/cpp/include/proton/endpoint.hpp b/cpp/include/proton/endpoint.hpp
index 50505ce..57df8de 100644
--- a/cpp/include/proton/endpoint.hpp
+++ b/cpp/include/proton/endpoint.hpp
@@ -24,7 +24,6 @@
 
 #include "./fwd.hpp"
 #include "./error_condition.hpp"
-#include "./internal/config.hpp"
 #include "./internal/export.hpp"
 
 /// @file
@@ -60,9 +59,6 @@ PN_CPP_CLASS_EXTERN endpoint {
     /// Close the endpoint with an error condition.
     virtual void close(const error_condition&) = 0;
 
-#if PN_CPP_HAS_DEFAULTED_FUNCTIONS && PN_CPP_HAS_DEFAULTED_MOVE_INITIALIZERS
-    // Make everything explicit for C++11 compilers
-
     /// @cond INTERNAL
     endpoint() = default;
     endpoint& operator=(const endpoint&) = default;
@@ -70,7 +66,6 @@ PN_CPP_CLASS_EXTERN endpoint {
     endpoint& operator=(endpoint&&) = default;
     endpoint(endpoint&&) = default;
     /// @endcond
-#endif
 };
 
 namespace internal {
diff --git a/cpp/include/proton/error.hpp b/cpp/include/proton/error.hpp
index 5ac409f..5471658 100644
--- a/cpp/include/proton/error.hpp
+++ b/cpp/include/proton/error.hpp
@@ -22,7 +22,6 @@
  *
  */
 
-#include "./internal/config.hpp"
 #include "./internal/export.hpp"
 
 #include <stdexcept>
diff --git a/cpp/include/proton/error_condition.hpp b/cpp/include/proton/error_condition.hpp
index 1ca7be8..9ab58e6 100644
--- a/cpp/include/proton/error_condition.hpp
+++ b/cpp/include/proton/error_condition.hpp
@@ -23,7 +23,6 @@
  */
 
 #include "./internal/export.hpp"
-#include "./internal/config.hpp"
 #include "./value.hpp"
 
 #include <string>
@@ -57,21 +56,17 @@ class error_condition {
     /// description, and informational properties.
     PN_CPP_EXTERN error_condition(std::string name, std::string description, proton::value properties);
 
-#if PN_CPP_HAS_DEFAULTED_FUNCTIONS && PN_CPP_HAS_DEFAULTED_MOVE_INITIALIZERS
     /// @cond INTERNAL
     error_condition(const error_condition&) = default;
     error_condition& operator=(const error_condition&) = default;
     error_condition(error_condition&&) = default;
     error_condition& operator=(error_condition&&) = default;
     /// @endcond
-#endif
 
-#if PN_CPP_HAS_EXPLICIT_CONVERSIONS
     /// If you are using a C++11 compiler, you may use an
     /// error_condition in boolean contexts. The expression will be
     /// true if the error_condition is set.
     PN_CPP_EXTERN explicit operator bool() const;
-#endif
 
     /// No condition set.
     PN_CPP_EXTERN bool operator!() const;
diff --git a/cpp/include/proton/fwd.hpp b/cpp/include/proton/fwd.hpp
index 5ae1d8a..801d269 100644
--- a/cpp/include/proton/fwd.hpp
+++ b/cpp/include/proton/fwd.hpp
@@ -25,7 +25,6 @@
 /// @file
 /// Forward declarations.
 
-#include "./internal/config.hpp"
 
 namespace proton {
 
@@ -62,13 +61,8 @@ class void_function0;
 class work_queue;
 
 namespace internal { namespace v03 { class work; } }
-
-#if PN_CPP_HAS_LAMBDAS && PN_CPP_HAS_VARIADIC_TEMPLATES
 namespace internal { namespace v11 { class work; } }
 using internal::v11::work;
-#else
-using internal::v03::work;
-#endif
 
 namespace io {
 
diff --git a/cpp/include/proton/internal/config.hpp b/cpp/include/proton/internal/config.hpp
deleted file mode 100644
index 321aebf..0000000
--- a/cpp/include/proton/internal/config.hpp
+++ /dev/null
@@ -1,137 +0,0 @@
-#ifndef PROTON_INTERNAL_CONFIG_HPP
-#define PROTON_INTERNAL_CONFIG_HPP
-
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-/// @cond INTERNAL
-
-/// @file
-///
-/// Configuration macros.  They can be set via -D compiler options or
-/// in code.
-///
-/// On a C++11 compliant compiler, all C++11 features are enabled by
-/// default.  Otherwise they can be enabled or disabled separately
-/// with -D on the compile line.
-
-// Read library compilation presets -
-// This sets the options the library itself was compiled with
-// and sets up the compilation options is we are compiling the library itself
-#include "config_presets.hpp"
-
-/// Whether the library supports threads depends on the configuration of the library compilation only
-#define PN_CPP_SUPPORTS_THREADS PN_CPP_LIB_HAS_CPP11 || (PN_CPP_LIB_HAS_STD_THREAD && PN_CPP_LIB_HAS_STD_MUTEX)
-/// @endcond
-
-/// The Apple clang compiler doesn't really support PN_CPP_HAS_THREAD_LOCAL
-/// before Xcode 8 even though it claims to be C++11 compatible
-#if defined(__clang__) && defined(__apple_build_version__) && ((__clang_major__ * 100) + __clang_minor__) >= 301
-#if __has_feature(cxx_thread_local)
-#define PN_CPP_HAS_THREAD_LOCAL 1
-#else
-#define PN_CPP_HAS_THREAD_LOCAL 0
-#endif
-#endif
-
-#ifndef PN_CPP_HAS_CPP11
-#if defined(__cplusplus) && __cplusplus >= 201103
-#define PN_CPP_HAS_CPP11 1
-#else
-#define PN_CPP_HAS_CPP11 0
-#endif
-#endif
-
-#ifndef PN_CPP_HAS_LONG_LONG_TYPE
-#define PN_CPP_HAS_LONG_LONG_TYPE PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_NULLPTR
-#define PN_CPP_HAS_NULLPTR PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_RVALUE_REFERENCES
-#define PN_CPP_HAS_RVALUE_REFERENCES PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_OVERRIDE
-#define PN_CPP_HAS_OVERRIDE PN_CPP_HAS_CPP11
-#endif
-
-#if PN_CPP_HAS_OVERRIDE
-#define PN_CPP_OVERRIDE override
-#else
-#define PN_CPP_OVERRIDE
-#endif
-
-#ifndef PN_CPP_HAS_EXPLICIT_CONVERSIONS
-#define PN_CPP_HAS_EXPLICIT_CONVERSIONS PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_DEFAULTED_FUNCTIONS
-#define PN_CPP_HAS_DEFAULTED_FUNCTIONS PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_DEFAULTED_MOVE_INITIALIZERS
-#define PN_CPP_HAS_DEFAULTED_MOVE_INITIALIZERS PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_DELETED_FUNCTIONS
-#define PN_CPP_HAS_DELETED_FUNCTIONS PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_THREAD_LOCAL
-#define PN_CPP_HAS_THREAD_LOCAL PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_VARIADIC_TEMPLATES
-#define PN_CPP_HAS_VARIADIC_TEMPLATES PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_LAMBDAS
-#define PN_CPP_HAS_LAMBDAS PN_CPP_HAS_CPP11
-#endif
-
-// Library features
-
-#ifndef PN_CPP_HAS_HEADER_RANDOM
-#define PN_CPP_HAS_HEADER_RANDOM PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_STD_UNIQUE_PTR
-#define PN_CPP_HAS_STD_UNIQUE_PTR PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_STD_MUTEX
-#define PN_CPP_HAS_STD_MUTEX PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_STD_ATOMIC
-#define PN_CPP_HAS_STD_ATOMIC PN_CPP_HAS_CPP11
-#endif
-
-#ifndef PN_CPP_HAS_STD_THREAD
-#define PN_CPP_HAS_STD_THREAD PN_CPP_HAS_CPP11
-#endif
-
-#endif // PROTON_INTERNAL_CONFIG_HPP
-
-/// @endcond
diff --git a/cpp/include/proton/internal/object.hpp b/cpp/include/proton/internal/object.hpp
index 7f116c9..98b6588 100644
--- a/cpp/include/proton/internal/object.hpp
+++ b/cpp/include/proton/internal/object.hpp
@@ -22,7 +22,6 @@
  *
  */
 
-#include "./config.hpp"
 #include "./export.hpp"
 #include "./comparable.hpp"
 
@@ -47,10 +46,7 @@ template <class T> class pn_ptr : private pn_ptr_base, private comparable<pn_ptr
     pn_ptr() : ptr_(0) {}
     pn_ptr(T* p) : ptr_(p) { incref(ptr_); }
     pn_ptr(const pn_ptr& o) : ptr_(o.ptr_) { incref(ptr_); }
-
-#if PN_CPP_HAS_RVALUE_REFERENCES
     pn_ptr(pn_ptr&& o) : ptr_(0) { std::swap(ptr_, o.ptr_); }
-#endif
 
     ~pn_ptr() { decref(ptr_); }
 
@@ -60,10 +56,7 @@ template <class T> class pn_ptr : private pn_ptr_base, private comparable<pn_ptr
     T* release() { T *p = ptr_; ptr_ = 0; return p; }
 
     bool operator!() const { return !ptr_; }
-
-#if PN_CPP_HAS_EXPLICIT_CONVERSIONS
     explicit operator bool() const { return !!ptr_; }
-#endif
 
     std::string inspect() const { return pn_ptr_base::inspect(ptr_); }
 
@@ -86,9 +79,7 @@ template <class T> pn_ptr<T> take_ownership(T* p) { return pn_ptr<T>::take_owner
 template <class T> class object : private comparable<object<T> > {
   public:
     bool operator!() const { return !object_; }
-#if PN_CPP_HAS_EXPLICIT_CONVERSIONS
     explicit operator bool() const { return object_.get(); }
-#endif
 
   protected:
     typedef T pn_type;
diff --git a/cpp/include/proton/internal/pn_unique_ptr.hpp b/cpp/include/proton/internal/pn_unique_ptr.hpp
index e47fbaa..51679d1 100644
--- a/cpp/include/proton/internal/pn_unique_ptr.hpp
+++ b/cpp/include/proton/internal/pn_unique_ptr.hpp
@@ -22,7 +22,6 @@
  *
  */
 
-#include "./config.hpp"
 
 #include <memory>
 
@@ -43,26 +42,18 @@ template <class T> void swap(pn_unique_ptr<T>& x, pn_unique_ptr<T>& y);
 template <class T> class pn_unique_ptr {
   public:
     pn_unique_ptr(T* p=0) : ptr_(p) {}
-#if PN_CPP_HAS_RVALUE_REFERENCES
     pn_unique_ptr(pn_unique_ptr&& x) : ptr_(0)  { std::swap(ptr_, x.ptr_); }
-#else
-    pn_unique_ptr(const pn_unique_ptr& x) : ptr_() { std::swap(ptr_, const_cast<pn_unique_ptr&>(x).ptr_); }
-#endif
     ~pn_unique_ptr() { delete(ptr_); }
     T& operator*() const { return *ptr_; }
     T* operator->() const { return ptr_; }
     T* get() const { return ptr_; }
     void reset(T* p = 0) { pn_unique_ptr<T> tmp(p); std::swap(ptr_, tmp.ptr_); }
     T* release() { T *p = ptr_; ptr_ = 0; return p; }
-#if PN_CPP_HAS_EXPLICIT_CONVERSIONS
     explicit operator bool() const { return get(); }
-#endif
     bool operator !() const { return !get(); }
     void swap(pn_unique_ptr& x) { std::swap(ptr_, x.ptr_); }
 
-#if PN_CPP_HAS_STD_UNIQUE_PTR
     operator std::unique_ptr<T>() { T *p = ptr_; ptr_ = 0; return std::unique_ptr<T>(p); }
-#endif
 
   private:
     T* ptr_;
diff --git a/cpp/include/proton/internal/type_traits.hpp b/cpp/include/proton/internal/type_traits.hpp
index c8b6bd0..54d352c 100644
--- a/cpp/include/proton/internal/type_traits.hpp
+++ b/cpp/include/proton/internal/type_traits.hpp
@@ -27,7 +27,6 @@
 // Also provides workarounds for missing type_traits classes on older
 // C++ compilers.
 
-#include "./config.hpp"
 #include "../types_fwd.hpp"
 #include "../type_id.hpp"
 
@@ -72,12 +71,10 @@ template <> struct is_signed<signed short> : public true_type {};
 template <> struct is_signed<signed int> : public true_type {};
 template <> struct is_signed<signed long> : public true_type {};
 
-#if PN_CPP_HAS_LONG_LONG_TYPE
 template <> struct is_integral<unsigned long long> : public true_type {};
 template <> struct is_integral<signed long long> : public true_type {};
 template <> struct is_signed<unsigned long long> : public false_type {};
 template <> struct is_signed<signed long long> : public true_type {};
-#endif
 
 template <class T, class U> struct is_same { static const bool value=false; };
 template <class T> struct is_same<T,T> { static const bool value=true; };
@@ -94,9 +91,7 @@ template <type_id ID, class T> struct type_id_constant {
 /// @{
 template <class T> struct type_id_of;
 template<> struct type_id_of<null> : public type_id_constant<NULL_TYPE, null> {};
-#if PN_CPP_HAS_NULLPTR
 template<> struct type_id_of<decltype(nullptr)> : public type_id_constant<NULL_TYPE, null> {};
-#endif
 template<> struct type_id_of<bool> : public type_id_constant<BOOLEAN, bool> {};
 template<> struct type_id_of<uint8_t> : public type_id_constant<UBYTE, uint8_t> {};
 template<> struct type_id_of<int8_t> : public type_id_constant<BYTE, int8_t> {};
diff --git a/cpp/include/proton/io/connection_driver.hpp b/cpp/include/proton/io/connection_driver.hpp
index 390a5c4..d273191 100644
--- a/cpp/include/proton/io/connection_driver.hpp
+++ b/cpp/include/proton/io/connection_driver.hpp
@@ -25,7 +25,6 @@
 #include "../connection_options.hpp"
 #include "../error_condition.hpp"
 #include "../fwd.hpp"
-#include "../internal/config.hpp"
 #include "../types_fwd.hpp"
 
 #include <proton/connection_driver.h>
diff --git a/cpp/include/proton/map.hpp b/cpp/include/proton/map.hpp
index f9d524c..ff9eed0 100644
--- a/cpp/include/proton/map.hpp
+++ b/cpp/include/proton/map.hpp
@@ -79,13 +79,11 @@ class PN_CPP_CLASS_EXTERN map {
     /// Copy a map.
     PN_CPP_EXTERN map& operator=(const map&);
 
-#if PN_CPP_HAS_RVALUE_REFERENCES
     /// Move a map.
     PN_CPP_EXTERN map(map&&);
 
     /// Move a map.
     PN_CPP_EXTERN map& operator=(map&&);
-#endif
     PN_CPP_EXTERN ~map();
 
     /// Type-safe assign from a compatible map, for instance
diff --git a/cpp/include/proton/message.hpp b/cpp/include/proton/message.hpp
index 347eadb..fc87050 100644
--- a/cpp/include/proton/message.hpp
+++ b/cpp/include/proton/message.hpp
@@ -64,13 +64,11 @@ class message {
     /// Copy a message.
     PN_CPP_EXTERN message& operator=(const message&);
 
-#if PN_CPP_HAS_RVALUE_REFERENCES
     /// Move a message.
     PN_CPP_EXTERN message(message&&);
 
     /// Move a message.
     PN_CPP_EXTERN message& operator=(message&&);
-#endif
 
     /// Create a message with its body set from any value that can be
     /// converted to a proton::value.
diff --git a/cpp/include/proton/null.hpp b/cpp/include/proton/null.hpp
index f9c44ff..f12cc03 100644
--- a/cpp/include/proton/null.hpp
+++ b/cpp/include/proton/null.hpp
@@ -25,7 +25,6 @@
 /// @file
 /// @copybrief proton::null
 
-#include "./internal/config.hpp"
 #include "./internal/comparable.hpp"
 #include "./internal/export.hpp"
 
@@ -39,10 +38,9 @@ namespace proton {
 class null : private internal::comparable<null> {
   public:
     null() {}
-#if PN_CPP_HAS_NULLPTR
     /// Constructed from nullptr literal
     null(decltype(nullptr)) {}
-#endif
+
     /// null instances are always equal
   friend bool operator==(const null&, const null&) { return true; }
     /// null instances are never unequal
diff --git a/cpp/include/proton/sasl.hpp b/cpp/include/proton/sasl.hpp
index a054086..59855dc 100644
--- a/cpp/include/proton/sasl.hpp
+++ b/cpp/include/proton/sasl.hpp
@@ -23,7 +23,6 @@
  */
 
 #include "./internal/export.hpp"
-#include "./internal/config.hpp"
 #include "./internal/object.hpp"
 
 #include <proton/sasl.h>
@@ -41,11 +40,7 @@ class sasl {
     sasl(pn_sasl_t* s) : object_(s) {}
     /// @endcond
 
-#if PN_CPP_HAS_DELETED_FUNCTIONS
     sasl() = delete;
-#else
-    sasl();
-#endif
 
   public:
     /// The result of the SASL negotiation.
diff --git a/cpp/include/proton/scalar_base.hpp b/cpp/include/proton/scalar_base.hpp
index 7e7c8d1..b98c44d 100644
--- a/cpp/include/proton/scalar_base.hpp
+++ b/cpp/include/proton/scalar_base.hpp
@@ -100,9 +100,7 @@ class scalar_base : private internal::comparable<scalar_base> {
     PN_CPP_EXTERN void put_(const binary&);
     PN_CPP_EXTERN void put_(const char* s); ///< Treated as an AMQP string
     PN_CPP_EXTERN void put_(const null&);
-#if PN_CPP_HAS_NULLPTR
     PN_CPP_EXTERN void put_(decltype(nullptr));
-#endif
 
     template<class T> void put(const T& x) { putter<T>::put(*this, x); }
 
@@ -128,9 +126,7 @@ class scalar_base : private internal::comparable<scalar_base> {
     PN_CPP_EXTERN void get_(symbol&) const;
     PN_CPP_EXTERN void get_(binary&) const;
     PN_CPP_EXTERN void get_(null&) const;
-#if PN_CPP_HAS_NULLPTR
     PN_CPP_EXTERN void get_(decltype(nullptr)&) const;
-#endif
 
 
     // use template structs, functions cannot be  partially specialized.
diff --git a/cpp/include/proton/ssl.hpp b/cpp/include/proton/ssl.hpp
index ea8dd17..cbec876 100644
--- a/cpp/include/proton/ssl.hpp
+++ b/cpp/include/proton/ssl.hpp
@@ -23,7 +23,6 @@
  */
 
 #include "./internal/export.hpp"
-#include "./internal/config.hpp"
 
 #include <proton/ssl.h>
 
@@ -40,11 +39,7 @@ class ssl {
     ssl(pn_ssl_t* s) : object_(s) {}
     /// @endcond
 
-#if PN_CPP_HAS_DELETED_FUNCTIONS
     ssl() = delete;
-#else
-    ssl();
-#endif
 
   public:
     /// Determines the level of peer validation.
diff --git a/cpp/include/proton/types.hpp b/cpp/include/proton/types.hpp
index 7d348e0..a59433a 100644
--- a/cpp/include/proton/types.hpp
+++ b/cpp/include/proton/types.hpp
@@ -27,7 +27,6 @@
 
 // TODO aconway 2016-03-15: described types, described arrays.
 
-#include "./internal/config.hpp"
 
 #include "./annotation_key.hpp"
 #include "./binary.hpp"
@@ -45,9 +44,7 @@
 #include "./codec/list.hpp"
 #include "./codec/map.hpp"
 #include "./codec/vector.hpp"
-#if PN_CPP_HAS_CPP11
 #include "./codec/forward_list.hpp"
 #include "./codec/unordered_map.hpp"
-#endif
 
 #endif // PROTON_TYPES_HPP
diff --git a/cpp/include/proton/types_fwd.hpp b/cpp/include/proton/types_fwd.hpp
index 99cfc35..94f371b 100644
--- a/cpp/include/proton/types_fwd.hpp
+++ b/cpp/include/proton/types_fwd.hpp
@@ -25,7 +25,6 @@
 /// @file
 /// Forward declarations for Proton types used to represent AMQP types.
 
-#include "./internal/config.hpp"
 
 namespace proton {
 
diff --git a/cpp/include/proton/value.hpp b/cpp/include/proton/value.hpp
index 896ad41..5204a72 100644
--- a/cpp/include/proton/value.hpp
+++ b/cpp/include/proton/value.hpp
@@ -69,10 +69,8 @@ class value : public internal::value_base, private internal::comparable<value> {
     /// @{
     PN_CPP_EXTERN value(const value&);
     PN_CPP_EXTERN value& operator=(const value&);
-#if PN_CPP_HAS_RVALUE_REFERENCES
     PN_CPP_EXTERN value(value&&);
     PN_CPP_EXTERN value& operator=(value&&);
-#endif
     /// @}
 
     /// Copy from any allowed type T.
@@ -159,12 +157,11 @@ template<class T> void coerce(const value& v, T& x) {
 template<> inline void get<null>(const value& v, null&) {
     assert_type_equal(NULL_TYPE, v.type());
 }
-#if PN_CPP_HAS_NULLPTR
+
 /// @copybrief get<null>()
 template<> inline void get<decltype(nullptr)>(const value& v, decltype(nullptr)&) {
     assert_type_equal(NULL_TYPE, v.type());
 }
-#endif
 
 /// Return a readable string representation of x for display purposes.
 PN_CPP_EXTERN std::string to_string(const value& x);
diff --git a/cpp/include/proton/work_queue.hpp b/cpp/include/proton/work_queue.hpp
index 580b201..bc09f88 100644
--- a/cpp/include/proton/work_queue.hpp
+++ b/cpp/include/proton/work_queue.hpp
@@ -25,15 +25,12 @@
 #include "./duration.hpp"
 #include "./fwd.hpp"
 #include "./function.hpp"
-#include "./internal/config.hpp"
 #include "./internal/export.hpp"
 #include "./internal/pn_unique_ptr.hpp"
 
 #include <functional>
 #include <utility>
-#if PN_CPP_HAS_LAMBDAS && PN_CPP_HAS_VARIADIC_TEMPLATES
 #include <type_traits>
-#endif
 
 struct pn_connection_t;
 struct pn_session_t;
@@ -72,10 +69,8 @@ struct invocable_wrapper {
         std::swap(wrapped_, newthis.wrapped_);
         return *this;
     }
-#if PN_CPP_HAS_RVALUE_REFERENCES
     invocable_wrapper(invocable_wrapper&& w): wrapped_(w.wrapped_) {}
     invocable_wrapper& operator=(invocable_wrapper&& that) {delete wrapped_; wrapped_ = that.wrapped_; return *this; }
-#endif
     ~invocable_wrapper() { delete wrapped_; }
 
     invocable_wrapper(const invocable& i): wrapped_(&i.clone()) {}
@@ -263,7 +258,6 @@ work make_work(R (*f)(A, B, C), A a, B b, C c) {
 
 } } // internal::v03
 
-#if PN_CPP_HAS_LAMBDAS && PN_CPP_HAS_VARIADIC_TEMPLATES
 
 namespace internal { namespace v11 {
 
@@ -311,12 +305,6 @@ work make_work(Rest&&... r) {
 using internal::v11::work;
 using internal::v11::make_work;
 
-#else
-
-using internal::v03::work;
-using internal::v03::make_work;
-
-#endif
 
 /// @endcond
 
@@ -380,10 +368,8 @@ class PN_CPP_CLASS_EXTERN work_queue {
   private:
     /// Declare both v03 and v11 if compiling with c++11 as the library contains both.
     /// A C++11 user should never call the v03 overload so it is private in this case
-#if PN_CPP_HAS_LAMBDAS && PN_CPP_HAS_VARIADIC_TEMPLATES
     PN_CPP_EXTERN bool add(internal::v03::work fn);
     PN_CPP_EXTERN void schedule(duration, internal::v03::work fn);
-#endif
 
     PN_CPP_EXTERN static work_queue& get(pn_connection_t*);
     PN_CPP_EXTERN static work_queue& get(pn_session_t*);
diff --git a/cpp/src/codec_test.cpp b/cpp/src/codec_test.cpp
index 53d7628..e6c9d83 100644
--- a/cpp/src/codec_test.cpp
+++ b/cpp/src/codec_test.cpp
@@ -20,7 +20,6 @@
 #include "test_bits.hpp"
 
 #include "proton/internal/data.hpp"
-#include "proton/internal/config.hpp"
 #include "proton/types.hpp"
 
 namespace {
@@ -91,11 +90,9 @@ int main(int, char**) {
     RUN_TEST(failed, simple_type_test(static_cast<unsigned int>(42)));
     RUN_TEST(failed, simple_type_test(static_cast<unsigned long>(42)));
 
-#if PN_CPP_HAS_LONG_LONG_TYPE
     RUN_TEST(failed, simple_type_test(static_cast<long long>(42)));
     RUN_TEST(failed, simple_type_test(static_cast<signed long long>(42)));
     RUN_TEST(failed, simple_type_test(static_cast<unsigned long long>(42)));
-#endif
 
     // value and scalar types, more tests in value_test and scalar_test.
     RUN_TEST(failed, simple_type_test(value("foo")));
diff --git a/cpp/src/connect_config_test.cpp b/cpp/src/connect_config_test.cpp
index 1649f7f..80c0372 100644
--- a/cpp/src/connect_config_test.cpp
+++ b/cpp/src/connect_config_test.cpp
@@ -150,7 +150,7 @@ void test_invalid_json() {
 class messaging_handler : public proton::messaging_handler {
     virtual void on_messaging_error(const error_condition&) = 0;
 
-    void on_error(const error_condition& c) PN_CPP_OVERRIDE {
+    void on_error(const error_condition& c) override {
         on_messaging_error(c);
     }
 };
@@ -158,7 +158,7 @@ class messaging_handler : public proton::messaging_handler {
 class listen_handler : public proton::listen_handler {
     virtual void on_listen_error(listener& , const string&) = 0;
 
-    void on_error(listener& l, const string& s) PN_CPP_OVERRIDE {
+    void on_error(listener& l, const string& s) override {
         on_listen_error(l, s);
     }
 };
@@ -168,19 +168,19 @@ class test_handler : public messaging_handler,  public listen_handler {
     connection_options connection_options_;
     listener listener_;
 
-    void on_open(listener& l) PN_CPP_OVERRIDE {
+    void on_open(listener& l) override {
         on_listener_start(l.container());
     }
 
-    connection_options on_accept(listener& l) PN_CPP_OVERRIDE {
+    connection_options on_accept(listener& l) override {
         return connection_options_;
     }
 
-    void on_container_start(container& c) PN_CPP_OVERRIDE {
+    void on_container_start(container& c) override {
         listener_ = c.listen("//:0", *this);
     }
 
-    void on_connection_open(connection& c) PN_CPP_OVERRIDE {
+    void on_connection_open(connection& c) override {
         if (!c.active()) {      // Server side
             opened_ = true;
             check_connection(c);
@@ -189,11 +189,11 @@ class test_handler : public messaging_handler,  public listen_handler {
         }
     }
 
-    void on_messaging_error(const error_condition& e) PN_CPP_OVERRIDE {
+    void on_messaging_error(const error_condition& e) override {
         FAIL("unexpected error " << e);
     }
 
-    void on_listen_error(listener&, const string& s) PN_CPP_OVERRIDE {
+    void on_listen_error(listener&, const string& s) override {
         FAIL("unexpected listen error " << s);
     }
 
@@ -229,14 +229,14 @@ class test_handler : public messaging_handler,  public listen_handler {
 class test_almost_default_connect : public test_handler {
   public:
 
-    void on_listener_start(container& c) PN_CPP_OVERRIDE {
+    void on_listener_start(container& c) override {
         ofstream os("connect.json");
         ASSERT(os << config_with_port(RAW_STRING("scheme":"amqp")));
         os.close();
         c.connect();
     }
 
-    void check_connection(connection& c) PN_CPP_OVERRIDE {
+    void check_connection(connection& c) override {
         ASSERT_EQUAL("localhost", c.virtual_host());
     }
 };
@@ -253,7 +253,7 @@ public:
 class test_default_connect : public test_handler {
   public:
 
-    void on_listener_start(container& c) PN_CPP_OVERRIDE {
+    void on_listener_start(container& c) override {
         c.connect();
     }
 
@@ -261,14 +261,14 @@ class test_default_connect : public test_handler {
     // connected or rejected due to error.
     //
     // We use a hacky way to get to the underlying C objects to check what's in them
-    void on_transport_open(proton::transport& transport) PN_CPP_OVERRIDE {
+    void on_transport_open(proton::transport& transport) override {
         proton::connection connection = transport.connection();
         internal_access_of<proton::connection, pn_connection_t> ic(connection);
         pn_connection_t* c = ic.pn_object();
         ASSERT_EQUAL(std::string("localhost"), pn_connection_get_hostname(c));
     }
 
-    void on_transport_error(proton::transport& t) PN_CPP_OVERRIDE {
+    void on_transport_error(proton::transport& t) override {
         ASSERT_SUBSTRING("localhost:5671", t.error().description());
         t.connection().container().stop();
     }
@@ -281,11 +281,11 @@ class test_default_connect : public test_handler {
 class test_host_user_pass : public test_handler {
   public:
 
-    void on_listener_start(proton::container & c) PN_CPP_OVERRIDE {
+    void on_listener_start(proton::container & c) override {
         connect(c, RAW_STRING("scheme":"amqp", "host":"127.0.0.1", "user":"user@proton", "password":"password"));
     }
 
-    void check_connection(connection& c) PN_CPP_OVERRIDE {
+    void check_connection(connection& c) override {
         ASSERT_EQUAL("127.0.0.1", c.virtual_host());
         if (pn_sasl_extended()) {
             ASSERT_EQUAL("user@proton", c.user());
@@ -309,7 +309,7 @@ class test_tls : public test_handler {
 
     test_tls() : test_handler(make_opts()) {}
 
-    void on_listener_start(proton::container & c) PN_CPP_OVERRIDE {
+    void on_listener_start(proton::container & c) override {
         connect(c, RAW_STRING("scheme":"amqps", "tls": { "verify":false }));
     }
 };
@@ -329,11 +329,11 @@ class test_tls_default_fail : public test_handler {
 
     test_tls_default_fail() : test_handler(make_opts()), failed_(false) {}
 
-    void on_listener_start(proton::container& c) PN_CPP_OVERRIDE {
+    void on_listener_start(proton::container& c) override {
         connect(c, RAW_STRING("scheme":"amqps"));
     }
 
-    void on_messaging_error(const proton::error_condition& c) PN_CPP_OVERRIDE {
+    void on_messaging_error(const proton::error_condition& c) override {
         if (failed_) return;
 
         ASSERT_SUBSTRING("verify failed", c.description());
@@ -365,7 +365,7 @@ class test_tls_external : public test_handler {
 
     test_tls_external() : test_handler(make_opts()) {}
 
-    void on_listener_start(container& c) PN_CPP_OVERRIDE {
+    void on_listener_start(container& c) override {
         connect(c, RAW_STRING(
                     "scheme":"amqps",
                     "sasl":{ "mechanisms": "EXTERNAL" },
@@ -395,7 +395,7 @@ class test_tls_plain : public test_handler {
 
     test_tls_plain() : test_handler(make_opts()) {}
 
-    void on_listener_start(container& c) PN_CPP_OVERRIDE {
+    void on_listener_start(container& c) override {
         connect(c, RAW_STRING(
                     "scheme":"amqps", "user":"user@proton", "password": "password",
                     "sasl":{ "mechanisms": "PLAIN" },
diff --git a/cpp/src/connection_driver_test.cpp b/cpp/src/connection_driver_test.cpp
index 9583f59..b56cd07 100644
--- a/cpp/src/connection_driver_test.cpp
+++ b/cpp/src/connection_driver_test.cpp
@@ -171,34 +171,34 @@ struct record_handler : public messaging_handler {
 
     size_t link_count() const { return senders.size() + receivers.size(); }
 
-    void on_receiver_open(receiver &l) PN_CPP_OVERRIDE {
+    void on_receiver_open(receiver &l) override {
         messaging_handler::on_receiver_open(l);
         receivers.push_back(l);
     }
 
-    void on_sender_open(sender &l) PN_CPP_OVERRIDE {
+    void on_sender_open(sender &l) override {
         messaging_handler::on_sender_open(l);
         senders.push_back(l);
     }
 
-    void on_session_open(session &s) PN_CPP_OVERRIDE {
+    void on_session_open(session &s) override {
         messaging_handler::on_session_open(s);
         sessions.push_back(s);
     }
 
-    void on_transport_error(transport& t) PN_CPP_OVERRIDE {
+    void on_transport_error(transport& t) override {
         transport_errors.push_back(t.error().what());
     }
 
-    void on_connection_error(connection& c) PN_CPP_OVERRIDE {
+    void on_connection_error(connection& c) override {
         connection_errors.push_back(c.error().what());
     }
 
-    void on_error(const proton::error_condition& c) PN_CPP_OVERRIDE {
+    void on_error(const proton::error_condition& c) override {
         unhandled_errors.push_back(c.what());
     }
 
-    void on_message(proton::delivery&, proton::message& m) PN_CPP_OVERRIDE {
+    void on_message(proton::delivery&, proton::message& m) override {
         messages.push_back(m);
     }
 };
diff --git a/cpp/src/container.cpp b/cpp/src/container.cpp
index 013fb4b..494ece8 100644
--- a/cpp/src/container.cpp
+++ b/cpp/src/container.cpp
@@ -91,9 +91,7 @@ listener container::listen(const std::string& url, listen_handler& l) { return i
 
 void container::run() { impl_->run(1); }
 
-#if PN_CPP_SUPPORTS_THREADS
 void container::run(int threads) { impl_->run(threads); }
-#endif
 
 void container::auto_stop(bool set) { impl_->auto_stop(set); }
 
@@ -116,9 +114,7 @@ returned<receiver> container::open_receiver(
 std::string container::id() const { return impl_->id(); }
 
 void container::schedule(duration d, internal::v03::work f) { return impl_->schedule(d, f); }
-#if PN_CPP_HAS_LAMBDAS && PN_CPP_HAS_VARIADIC_TEMPLATES
 void container::schedule(duration d, internal::v11::work f) { return impl_->schedule(d, f); }
-#endif
 
 void container::schedule(duration d, void_function0& f) { return impl_->schedule(d, make_work(&void_function0::operator(), &f)); }
 
diff --git a/cpp/src/container_test.cpp b/cpp/src/container_test.cpp
index d6e347e..d49aad9 100644
--- a/cpp/src/container_test.cpp
+++ b/cpp/src/container_test.cpp
@@ -37,12 +37,10 @@
 #include <string>
 #include <cstdio>
 #include <sstream>
+#include <thread>
+#include <mutex>
+#include <condition_variable>
 
-#if PN_CPP_SUPPORTS_THREADS
-# include <thread>
-# include <mutex>
-# include <condition_variable>
-#endif
 
 namespace {
 
@@ -62,11 +60,11 @@ struct test_listen_handler : public proton::listen_handler {
                         const proton::connection_options& opts=proton::connection_options()
     ) : on_open_(false), on_accept_(false), on_close_(false), host_(host), opts_(opts) {}
 
-    proton::connection_options on_accept(proton::listener&) PN_CPP_OVERRIDE {
+    proton::connection_options on_accept(proton::listener&) override {
         on_accept_ = true;
         return proton::connection_options();
     }
-    void on_open(proton::listener& l) PN_CPP_OVERRIDE {
+    void on_open(proton::listener& l) override {
         on_open_ = true;
         ASSERT(!on_accept_);
         ASSERT(on_error_.empty());
@@ -74,12 +72,12 @@ struct test_listen_handler : public proton::listen_handler {
         l.container().connect(make_url(host_, l.port()), opts_);
     }
 
-    void on_close(proton::listener&) PN_CPP_OVERRIDE {
+    void on_close(proton::listener&) override {
         on_close_ = true;
         ASSERT(on_open_ || on_error_.size());
     }
 
-    void on_error(proton::listener&, const std::string& e) PN_CPP_OVERRIDE {
+    void on_error(proton::listener&, const std::string& e) override {
         on_error_ = e;
         ASSERT(!on_close_);
     }
@@ -102,11 +100,11 @@ class test_handler : public proton::messaging_handler {
         : closing(false), done(false), listen_handler(h, c_opts)
     {}
 
-    void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container &c) override {
         listener = c.listen("//:0", listen_handler);
     }
 
-    void on_connection_open(proton::connection &c) PN_CPP_OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         ASSERT(listen_handler.on_open_);
         ASSERT(!listen_handler.on_close_);
         ASSERT(listen_handler.on_error_.empty());
@@ -123,7 +121,7 @@ class test_handler : public proton::messaging_handler {
         closing = true;
     }
 
-    void on_connection_close(proton::connection &) PN_CPP_OVERRIDE {
+    void on_connection_close(proton::connection &) override {
         if (!done) listener.stop();
         done = true;
     }
@@ -228,7 +226,7 @@ class stop_tester : public proton::messaging_handler {
     test_listen_handler listen_handler;
 
     // Set up a listener which would block forever
-    void on_container_start(proton::container& c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container& c) override {
         ASSERT(state==0);
         listener = c.listen("//:0", listen_handler);
         c.auto_stop(false);
@@ -236,22 +234,22 @@ class stop_tester : public proton::messaging_handler {
     }
 
     // Get here twice - once for listener, once for connector
-    void on_connection_open(proton::connection &c) PN_CPP_OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         c.close();
         state++;
     }
 
-    void on_connection_close(proton::connection &c) PN_CPP_OVERRIDE {
+    void on_connection_close(proton::connection &c) override {
         ASSERT(state==3);
         c.container().stop();
         state = 4;
     }
-    void on_container_stop(proton::container & ) PN_CPP_OVERRIDE {
+    void on_container_stop(proton::container & ) override {
         ASSERT(state==4);
         state = 5;
     }
 
-    void on_transport_error(proton::transport & t) PN_CPP_OVERRIDE {
+    void on_transport_error(proton::transport & t) override {
         // Do nothing - ignore transport errors - we're going to get one when
         // the container stops.
     }
@@ -280,16 +278,16 @@ struct hang_tester : public proton::messaging_handler {
         c->connect(make_url("", listener.port()));
     }
 
-    void on_container_start(proton::container& c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container& c) override {
         listener = c.listen("//:0");
         c.schedule(proton::duration(250), proton::make_work(&hang_tester::connect, this, &c));
     }
 
-    void on_connection_open(proton::connection& c) PN_CPP_OVERRIDE {
+    void on_connection_open(proton::connection& c) override {
         c.close();
     }
 
-    void on_connection_close(proton::connection& c) PN_CPP_OVERRIDE {
+    void on_connection_close(proton::connection& c) override {
         if (!done) {
             done = true;
             listener.stop();
@@ -305,7 +303,7 @@ int test_container_schedule_nohang() {
 
 class immediate_stop_tester : public proton::messaging_handler {
 public:
-    void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container &c) override {
         c.stop();
     }
 };
@@ -327,7 +325,7 @@ int test_container_pre_stop() {
 struct schedule_tester : public proton::messaging_handler {
     void stop(proton::container* c) { c->stop(); }
 
-    void on_container_start(proton::container& c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container& c) override {
         c.schedule(proton::duration(250), proton::make_work(&schedule_tester::stop, this, &c));
     }
 };
@@ -362,11 +360,11 @@ class link_test_handler : public proton::messaging_handler {//, public proton::l
           sender_options(s_opts)
     {}
 
-    void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container &c) override {
         listener = c.listen("//:0", listen_handler);
     }
 
-    void on_connection_open(proton::connection &c) PN_CPP_OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         if (c.uninitialized()) {
             proton::messaging_handler::on_connection_open(c);
             c.open_receiver("", receiver_options);
@@ -382,14 +380,14 @@ class link_test_handler : public proton::messaging_handler {//, public proton::l
         }
     }
 
-    void on_receiver_open(proton::receiver &l) PN_CPP_OVERRIDE {
+    void on_receiver_open(proton::receiver &l) override {
         had_receiver = true;
         // When a client creates a sender then the server is notified about it as a receiver
         peer_sender_properties = l.properties();
         check_close(l);
     }
 
-    void on_sender_open(proton::sender &l) PN_CPP_OVERRIDE {
+    void on_sender_open(proton::sender &l) override {
         had_sender = true;
         // When a client creates a receiver then the server is notified about it as a sender
         peer_receiver_properties = l.properties();
@@ -432,8 +430,6 @@ int test_container_links_properties() {
     return 0;
 }
 
-#if PN_CPP_SUPPORTS_THREADS // Tests that require thread support
-
 class test_mt_handler : public proton::messaging_handler {
   public:
     std::mutex lock_;
@@ -456,11 +452,11 @@ class test_mt_handler : public proton::messaging_handler {
     }
 
     proton::error_condition error() const { return err_; }
-    void on_container_start(proton::container &) PN_CPP_OVERRIDE { set("start"); }
-    void on_connection_open(proton::connection &) PN_CPP_OVERRIDE { set("open"); }
+    void on_container_start(proton::container &) override { set("start"); }
+    void on_connection_open(proton::connection &) override { set("open"); }
 
     // Catch errors and save.
-    void on_error(const proton::error_condition& e) PN_CPP_OVERRIDE { err_ = e; }
+    void on_error(const proton::error_condition& e) override { err_ = e; }
 };
 
 class container_runner {
@@ -527,7 +523,7 @@ public:
 
     test_mt_handler_wq() : wq_(0) {}
 
-    void on_connection_open(proton::connection &c) PN_CPP_OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         {
             std::unique_lock<std::mutex> l(wqlock_);
             // Just record first connection side, inbound or outbound
@@ -546,7 +542,7 @@ public:
         wq_->add(call_do_close_);
     }
     void do_close() { connection_.close(); }
-    void on_connection_close(proton::connection &) PN_CPP_OVERRIDE { set("closed"); }
+    void on_connection_close(proton::connection &) override { set("closed"); }
 };
 
 void test_container_mt_close_race() {
@@ -578,8 +574,6 @@ void test_container_mt_close_race() {
     }
 }
 
-#endif
-
 } // namespace
 
 int main(int argc, char** argv) {
@@ -598,10 +592,8 @@ int main(int argc, char** argv) {
     RUN_ARGV_TEST(failed, test_container_schedule_stop());
     RUN_ARGV_TEST(failed, test_container_links_no_properties());
     RUN_ARGV_TEST(failed, test_container_links_properties());
-#if PN_CPP_SUPPORTS_THREADS
     RUN_ARGV_TEST(failed, test_container_mt_stop_empty());
     RUN_ARGV_TEST(failed, test_container_mt_stop());
     RUN_ARGV_TEST(failed, test_container_mt_close_race());
-#endif
     return failed;
 }
diff --git a/cpp/src/credit_test.cpp b/cpp/src/credit_test.cpp
index a57366e..a6993cb 100644
--- a/cpp/src/credit_test.cpp
+++ b/cpp/src/credit_test.cpp
@@ -61,7 +61,7 @@ class server_connection_handler : public proton::messaging_handler {
             opts.handler(h);
         }
 
-        void on_open(proton::listener& l) PN_CPP_OVERRIDE {
+        void on_open(proton::listener& l) override {
             std::ostringstream o;
             o << "//:" << l.port(); // Connect to the actual listening port
             url = o.str();
@@ -70,7 +70,7 @@ class server_connection_handler : public proton::messaging_handler {
                                    proton::make_work(&waiter::done, &listen_waiter));
         }
 
-        proton::connection_options on_accept(proton::listener&) PN_CPP_OVERRIDE { return opts; }
+        proton::connection_options on_accept(proton::listener&) override { return opts; }
     };
 
     proton::listener listener_;
@@ -102,18 +102,18 @@ class server_connection_handler : public proton::messaging_handler {
         return listen_handler_.url;
     }
 
-    void on_connection_open(proton::connection &c) PN_CPP_OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         // Only listen for a single connection
         listener_.stop();
         c.open();
     }
 
-    void on_sender_open(proton::sender &s) PN_CPP_OVERRIDE {
+    void on_sender_open(proton::sender &s) override {
         s.open();
         sender_ = s;
     }
 
-    void on_sendable(proton::sender &s) PN_CPP_OVERRIDE {
+    void on_sendable(proton::sender &s) override {
         send_available_messages(s);
     }
 
@@ -133,13 +133,13 @@ class server_connection_handler : public proton::messaging_handler {
         notify_wq_->add(notify_work_);
     }
 
-    void on_tracker_accept(proton::tracker& d) PN_CPP_OVERRIDE {
+    void on_tracker_accept(proton::tracker& d) override {
         acked_++;
         if (acked_ == expect_ && (available_ == 0 || d.sender().credit() == 0))
             notify_idle();
     }
 
-    void on_transport_error(proton::transport & ) PN_CPP_OVERRIDE {
+    void on_transport_error(proton::transport & ) override {
         // If we get an error then (try to) stop the listener
         // - this will stop the listener if we didn't already accept a connection
         listener_.stop();
@@ -157,20 +157,20 @@ class tester : public proton::messaging_handler, public waiter {
     tester() : waiter(1), container_(*this, "credit_tester"),
                received_(0), initial_credit_(0) {}
 
-    void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container &c) override {
         srv_.reset(new server_connection_handler(c, 100000, *this));
     }
 
     // waiter::ready is called when listener can accept connections.
-    void ready() PN_CPP_OVERRIDE {
+    void ready() override {
         container_.connect(srv_->url());
     }
 
-    void on_connection_open(proton::connection& c) PN_CPP_OVERRIDE {
+    void on_connection_open(proton::connection& c) override {
         c.open_receiver("messages", proton::receiver_options().credit_window(0));
     }
 
-    void on_receiver_open(proton::receiver &r) PN_CPP_OVERRIDE {
+    void on_receiver_open(proton::receiver &r) override {
         receiver_ = r;
         next_idle_ = proton::make_work(&tester::first_idle, this);
         proton::work call_on_server_idle(make_work(&tester::on_server_idle, this));
@@ -178,7 +178,7 @@ class tester : public proton::messaging_handler, public waiter {
         r.add_credit(initial_credit_);
     }
 
-    void on_message(proton::delivery &d, proton::message &m) PN_CPP_OVERRIDE {
+    void on_message(proton::delivery &d, proton::message &m) override {
         received_++;
         d.accept();
     }
@@ -204,7 +204,7 @@ class tester : public proton::messaging_handler, public waiter {
         receiver_.connection().close();
     }
 
-    void on_connection_close(proton::connection& c) PN_CPP_OVERRIDE {
+    void on_connection_close(proton::connection& c) override {
         if (!fail_msg_.empty())
             FAIL(fail_msg_);
     }
@@ -226,7 +226,7 @@ class basic_credit_tester : public tester {
   public:
     basic_credit_tester() { initial_credit_ = 3; }
 
-    void first_idle() PN_CPP_OVERRIDE {
+    void first_idle() override {
         if (received_ != 3) {
             fail(FAIL_MSG("messages received should be 3 not "), received_);
             return;
@@ -269,11 +269,11 @@ class drain_credit_tester : public tester {
   public:
     drain_credit_tester() : drain_finishes_(0) { initial_credit_ = 10; }
 
-    void on_receiver_drain_finish(proton::receiver &r) PN_CPP_OVERRIDE {
+    void on_receiver_drain_finish(proton::receiver &r) override {
         drain_finishes_++;
     }
 
-    void first_idle() PN_CPP_OVERRIDE {
+    void first_idle() override {
         if (received_ != 10) {
             fail(FAIL_MSG("messages received should be 10 not "), received_);
             return;
diff --git a/cpp/src/decoder.cpp b/cpp/src/decoder.cpp
index 9a5ace3..284d531 100644
--- a/cpp/src/decoder.cpp
+++ b/cpp/src/decoder.cpp
@@ -141,13 +141,11 @@ decoder& decoder::operator>>(null&) {
     return *this;
 }
 
-#if PN_CPP_HAS_NULLPTR
 decoder& decoder::operator>>(decltype(nullptr)&) {
     internal::state_guard sg(*this);
     assert_type_equal(NULL_TYPE, pre_get());
     return *this;
 }
-#endif
 
 decoder& decoder::operator>>(internal::value_base& x) {
     if (*this == x.data_)
diff --git a/cpp/src/delivery_test.cpp b/cpp/src/delivery_test.cpp
index 93dfa40..e4c69eb 100644
--- a/cpp/src/delivery_test.cpp
+++ b/cpp/src/delivery_test.cpp
@@ -56,7 +56,7 @@ int listener_port;
 class test_recv : public proton::messaging_handler {
   private:
     class listener_ready_handler : public proton::listen_handler {
-        void on_open(proton::listener &l) PN_CPP_OVERRIDE {
+        void on_open(proton::listener &l) override {
             {
                 std::lock_guard<std::mutex> lk(m);
                 listener_port = l.port();
@@ -73,11 +73,11 @@ class test_recv : public proton::messaging_handler {
   public:
     test_recv(const std::string &s) : url(s) {}
 
-    void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container &c) override {
         listener = c.listen(url, listen_handler);
     }
 
-    void on_message(proton::delivery &d, proton::message &msg) PN_CPP_OVERRIDE {
+    void on_message(proton::delivery &d, proton::message &msg) override {
         proton::binary test_tag_recv("TESTTAG");
         ASSERT_EQUAL(test_tag_recv, d.tag());
         d.receiver().close();
@@ -94,12 +94,12 @@ class test_send : public proton::messaging_handler {
   public:
     test_send(const std::string &s) : url(s) {}
 
-    void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container &c) override {
         proton::connection_options co;
         sender = c.open_sender(url, co);
     }
 
-    void on_sendable(proton::sender &s) PN_CPP_OVERRIDE {
+    void on_sendable(proton::sender &s) override {
         proton::message msg;
         msg.body("message");
         proton::binary test_tag_send("TESTTAG");
diff --git a/cpp/src/encoder.cpp b/cpp/src/encoder.cpp
index 3430031..30ec5a8 100644
--- a/cpp/src/encoder.cpp
+++ b/cpp/src/encoder.cpp
@@ -145,9 +145,7 @@ encoder& encoder::operator<<(const std::string& x) { return insert(x, pn_data_pu
 encoder& encoder::operator<<(const symbol& x) { return insert(x, pn_data_put_amqp_symbol); }
 encoder& encoder::operator<<(const binary& x) { return insert(x, pn_data_put_amqp_binary); }
 encoder& encoder::operator<<(const null&) { pn_data_put_null(pn_object()); return *this; }
-#if PN_CPP_HAS_NULLPTR
 encoder& encoder::operator<<(decltype(nullptr)) { pn_data_put_null(pn_object()); return *this; }
-#endif
 
 encoder& encoder::operator<<(const scalar_base& x) { return insert(x.atom_, pn_data_put_atom); }
 
diff --git a/cpp/src/error_condition.cpp b/cpp/src/error_condition.cpp
index 91e763a..6934ed0 100644
--- a/cpp/src/error_condition.cpp
+++ b/cpp/src/error_condition.cpp
@@ -51,11 +51,9 @@ error_condition::error_condition(std::string name, std::string description, valu
     properties_(properties)
 {}
 
-#if PN_CPP_HAS_EXPLICIT_CONVERSIONS
 error_condition::operator bool() const {
   return !name_.empty();
 }
-#endif
 
 bool error_condition::operator!() const {
     return name_.empty();
diff --git a/cpp/src/map.cpp b/cpp/src/map.cpp
index 86bd8c5..fdfb3fd 100644
--- a/cpp/src/map.cpp
+++ b/cpp/src/map.cpp
@@ -70,7 +70,6 @@ map<K,T>& map<K,T>::operator=(const map& x) {
     return *this;
 }
 
-#if PN_CPP_HAS_RVALUE_REFERENCES
 template <class K, class T>
 map<K,T>::map(map&& x) :
     map_(std::move(x.map_)), value_(std::move(x.value_)) {}
@@ -83,7 +82,6 @@ map<K,T>& map<K,T>::operator=(map&& x) {
     }
     return *this;
 }
-#endif
 
 template <class K, class T>
 map<K,T>::~map() {}
diff --git a/cpp/src/message.cpp b/cpp/src/message.cpp
index 5c0df8d..5902ba0 100644
--- a/cpp/src/message.cpp
+++ b/cpp/src/message.cpp
@@ -70,14 +70,11 @@ struct message::impl {
 
 message::message() : pn_msg_(0) {}
 message::message(const message &m) : pn_msg_(0) { *this = m; }
-
-#if PN_CPP_HAS_RVALUE_REFERENCES
 message::message(message &&m) : pn_msg_(0) { swap(*this, m); }
 message& message::operator=(message&& m) {
   swap(*this, m);
   return *this;
 }
-#endif
 
 message::message(const value& x) : pn_msg_(0) { body() = x; }
 
diff --git a/cpp/src/proactor_container_impl.cpp b/cpp/src/proactor_container_impl.cpp
index 1fae73b..44dfffe 100644
--- a/cpp/src/proactor_container_impl.cpp
+++ b/cpp/src/proactor_container_impl.cpp
@@ -44,14 +44,8 @@
 
 #include <algorithm>
 #include <vector>
-
-#if PN_CPP_SUPPORTS_THREADS
-# include <thread>
-#endif
-
-#if PN_CPP_HAS_HEADER_RANDOM
-# include <random>
-#endif
+#include <thread>
+#include <random>
 
 // XXXX: Debug
 //#include <iostream>
@@ -270,19 +264,12 @@ void container::impl::reconnect(pn_connection_t* pnc) {
 }
 
 namespace {
-#if PN_CPP_HAS_HEADER_RANDOM && PN_CPP_HAS_THREAD_LOCAL
 duration random_between(duration min, duration max)
 {
     static thread_local std::default_random_engine gen;
     std::uniform_int_distribution<duration::numeric_type> dist{min.milliseconds(), max.milliseconds()};
     return duration(dist(gen));
 }
-#else
-duration random_between(duration, duration max)
-{
-    return max;
-}
-#endif
 
 duration next_delay(reconnect_context& rc) {
     // If we've not retried before do it immediately
@@ -800,7 +787,6 @@ void container::impl::run(int threads) {
     // Have to "manually" generate container events
     CALL_ONCE(start_once_, &impl::start_event, this);
 
-#if PN_CPP_SUPPORTS_THREADS
     // Run handler threads
     threads = std::max(threads, 1); // Ensure at least 1 thread
     typedef std::vector<std::thread*> vt; // pointer vector to work around failures in older compilers
@@ -816,10 +802,6 @@ void container::impl::run(int threads) {
         (*i)->join();
         delete *i;
     }
-#else
-    // Run a single handler thread (As we have no threading API)
-    thread();
-#endif
 
     bool last = false;
     {
diff --git a/cpp/src/proactor_container_impl.hpp b/cpp/src/proactor_container_impl.hpp
index c8dd1ad..f3475b0 100644
--- a/cpp/src/proactor_container_impl.hpp
+++ b/cpp/src/proactor_container_impl.hpp
@@ -43,18 +43,11 @@
 #include <string>
 #include <vector>
 
-#if PN_CPP_SUPPORTS_THREADS
 #include <mutex>
 # define MUTEX(x) std::mutex x;
 # define GUARD(x) std::lock_guard<std::mutex> g(x)
 # define ONCE_FLAG(x) std::once_flag x;
 # define CALL_ONCE(x, ...) std::call_once(x, __VA_ARGS__)
-#else
-# define MUTEX(x)
-# define GUARD(x)
-# define ONCE_FLAG(x)
-# define CALL_ONCE(x, f, o) ((o)->*(f))()
-#endif
 
 struct pn_proactor_t;
 struct pn_listener_t;
diff --git a/cpp/src/reconnect_test.cpp b/cpp/src/reconnect_test.cpp
index 17907f1..58e5751 100644
--- a/cpp/src/reconnect_test.cpp
+++ b/cpp/src/reconnect_test.cpp
@@ -62,7 +62,7 @@ class server_connection_handler : public proton::messaging_handler {
             opts.handler(h);
         }
 
-        void on_open(proton::listener& l) PN_CPP_OVERRIDE {
+        void on_open(proton::listener& l) override {
             std::ostringstream o;
             o << "//:" << l.port(); // Connect to the actual listening port
             url = o.str();
@@ -71,7 +71,7 @@ class server_connection_handler : public proton::messaging_handler {
                                    proton::make_work(&waiter::done, &listen_waiter));
         }
 
-        proton::connection_options on_accept(proton::listener&) PN_CPP_OVERRIDE { return opts; }
+        proton::connection_options on_accept(proton::listener&) override { return opts; }
     };
 
     proton::listener listener_;
@@ -99,14 +99,14 @@ class server_connection_handler : public proton::messaging_handler {
         return listen_handler_.url;
     }
 
-    void on_connection_open(proton::connection &c) PN_CPP_OVERRIDE {
+    void on_connection_open(proton::connection &c) override {
         // Only listen for a single connection
         listener_.stop();
         if (messages_==expect_) close(c);
         else c.open();
     }
 
-    void on_receiver_open(proton::receiver &r) PN_CPP_OVERRIDE {
+    void on_receiver_open(proton::receiver &r) override {
         // Reduce message noise in PN_TRACE output for debugging.
         // Only the first message is relevant
         // Control accepts, accepting the message tells the client to finally close.
@@ -114,14 +114,14 @@ class server_connection_handler : public proton::messaging_handler {
         r.add_credit(1);
     }
 
-    void on_message(proton::delivery & d, proton::message & m) PN_CPP_OVERRIDE {
+    void on_message(proton::delivery & d, proton::message & m) override {
         ++messages_;
         proton::connection c = d.connection();
         if (messages_==expect_) close(c);
         else d.accept();
     }
 
-    void on_transport_error(proton::transport & ) PN_CPP_OVERRIDE {
+    void on_transport_error(proton::transport & ) override {
         // If we get an error then (try to) stop the listener
         // - this will stop the listener if we didn't already accept a connection
         listener_.stop();
@@ -134,7 +134,7 @@ class tester : public proton::messaging_handler, public waiter {
                start_count(0), open_count(0),
                link_open_count(0), transport_error_count(0), transport_close_count(0) {}
 
-    void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container &c) override {
         // Server that fails upon connection
         s1.reset(new server_connection_handler(c, 0, *this));
         // Server that fails on first message
@@ -144,14 +144,14 @@ class tester : public proton::messaging_handler, public waiter {
     }
 
     // waiter::ready is called when all 3 listeners are ready.
-    void ready() PN_CPP_OVERRIDE {
+    void ready() override {
         std::vector<std::string> urls;
         urls.push_back(s2->url());
         urls.push_back(s3->url());
         container_.connect(s1->url(), proton::connection_options().failover_urls(urls));
     }
 
-    void on_connection_open(proton::connection& c) PN_CPP_OVERRIDE {
+    void on_connection_open(proton::connection& c) override {
         if (!c.reconnected()) {
             start_count++;
             c.open_sender("messages");
@@ -160,24 +160,24 @@ class tester : public proton::messaging_handler, public waiter {
         open_count++;
     }
 
-    void on_sender_open(proton::sender &s) PN_CPP_OVERRIDE {
+    void on_sender_open(proton::sender &s) override {
         link_open_count++;
     }
 
-    void on_sendable(proton::sender& s) PN_CPP_OVERRIDE {
+    void on_sendable(proton::sender& s) override {
         s.send(proton::message("hello"));
     }
 
-    void on_tracker_accept(proton::tracker& d) PN_CPP_OVERRIDE {
+    void on_tracker_accept(proton::tracker& d) override {
         d.connection().close();
     }
 
-    void on_transport_error(proton::transport& t) PN_CPP_OVERRIDE {
+    void on_transport_error(proton::transport& t) override {
         ASSERT_EQUAL(bool(transport_error_count), t.connection().reconnected());
         transport_error_count++;
     }
 
-    void on_transport_close(proton::transport& t) PN_CPP_OVERRIDE {
+    void on_transport_close(proton::transport& t) override {
         transport_close_count++;
     }
 
@@ -220,7 +220,7 @@ class stop_reconnect_tester : public proton::messaging_handler {
         container_.stop();
     }
 
-    void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container &c) override {
         proton::reconnect_options reconnect_options;
         c.connect("this-is-not-going-to work.com", proton::connection_options().reconnect(reconnect_options));
         c.schedule(proton::duration::SECOND, proton::make_work(&stop_reconnect_tester::deferred_stop, this));
@@ -249,17 +249,17 @@ class authfail_reconnect_tester : public proton::messaging_handler, public waite
         container_.stop();
     }
 
-    void on_container_start(proton::container& c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container& c) override {
         // This server won't fail in this test
         s1.reset(new server_connection_handler(c, 100, *this));
         c.schedule(proton::duration::SECOND, proton::make_work(&authfail_reconnect_tester::deferred_stop, this));
     }
 
-    void on_transport_error(proton::transport& t) PN_CPP_OVERRIDE {
+    void on_transport_error(proton::transport& t) override {
         errored_ = true;
     }
 
-    void ready() PN_CPP_OVERRIDE {
+    void ready() override {
         proton::connection_options co;
         co.sasl_allowed_mechs("PLAIN");
         co.reconnect(proton::reconnect_options());
@@ -283,20 +283,20 @@ class test_reconnecting_close : public proton::messaging_handler, public waiter
     test_reconnecting_close() : waiter(1), container_(*this, "test_reconnecting_close"),
                                 transport_error_called(false) {}
 
-    void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container &c) override {
         s1.reset(new server_connection_handler(c, 0, *this));
     }
 
-    void ready() PN_CPP_OVERRIDE {
+    void ready() override {
         container_.connect(s1->url(), proton::connection_options().reconnect(proton::reconnect_options()));
     }
 
-    void on_transport_error(proton::transport& t) PN_CPP_OVERRIDE {
+    void on_transport_error(proton::transport& t) override {
         transport_error_called = true;
         t.connection().close();                        // Abort reconnection
     }
 
-    void on_connection_close(proton::connection& c) PN_CPP_OVERRIDE {
+    void on_connection_close(proton::connection& c) override {
         ASSERT(0);              // Not expecting any clean close
     }
 
@@ -328,7 +328,7 @@ public:
 
     proton::connection_options copts() { return proton::connection_options(); }
 
-    void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container &c) override {
         // Never actually connects, keeps re-trying to bogus hostnames with
         // changing options.
         c.connect("nosuchhost0",
@@ -339,7 +339,7 @@ public:
                   .reconnect_url("hahaha1"));
     }
 
-    void on_transport_error(proton::transport &t) PN_CPP_OVERRIDE {
+    void on_transport_error(proton::transport &t) override {
         switch (++errors_) {
         case 1:
             ASSERT_SUBSTRING("nosuchhost0", t.error().what()); // First failure
@@ -383,13 +383,13 @@ public:
 
     proton::connection_options copts() { return proton::connection_options(); }
 
-    void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container &c) override {
         // Never actually connects, keeps re-trying to bogus hostnames with
         // changing options.
         c.connect("nosuchhost0", copts().reconnect(ropts()).virtual_host("vhost0").user("user0"));
     }
 
-    void on_transport_error(proton::transport &t) PN_CPP_OVERRIDE {
+    void on_transport_error(proton::transport &t) override {
         switch (++errors_) {
         case 1:
             ASSERT_SUBSTRING("nosuchhost0", t.error().what()); // First failure
@@ -440,13 +440,13 @@ public:
 
     proton::connection_options copts() { return proton::connection_options(); }
 
-    void on_container_start(proton::container &c) PN_CPP_OVERRIDE {
+    void on_container_start(proton::container &c) override {
         // Never actually connects, keeps re-trying to bogus hostnames with
         // changing options.
         c.connect("nosuchhost0", copts().reconnect(ropts()).virtual_host("vhost0").user("user0"));
     }
 
-    void on_transport_error(proton::transport &t) PN_CPP_OVERRIDE {
+    void on_transport_error(proton::transport &t) override {
         switch (++errors_) {
         case 1:
             ASSERT_SUBSTRING("nosuchhost0", t.error().what()); // First failure
diff --git a/cpp/src/scalar_base.cpp b/cpp/src/scalar_base.cpp
index d18a272..8f0aef9 100644
--- a/cpp/src/scalar_base.cpp
+++ b/cpp/src/scalar_base.cpp
@@ -84,9 +84,7 @@ void scalar_base::put_(const symbol& x) { set(binary(x), PN_SYMBOL); }
 void scalar_base::put_(const binary& x) { set(x, PN_BINARY); }
 void scalar_base::put_(const char* x) { set(binary(std::string(x)), PN_STRING); }
 void scalar_base::put_(const null&) { atom_.type = PN_NULL; }
-#if PN_CPP_HAS_NULLPTR
 void scalar_base::put_(decltype(nullptr)) { atom_.type = PN_NULL; }
-#endif
 
 
 void scalar_base::ok(pn_type_t t) const {
@@ -114,9 +112,7 @@ void scalar_base::get_(std::string& x) const { ok(PN_STRING); x = std::string(by
 void scalar_base::get_(symbol& x) const { ok(PN_SYMBOL); x = symbol(bytes_.begin(), bytes_.end()); }
 void scalar_base::get_(binary& x) const { ok(PN_BINARY); x = bytes_; }
 void scalar_base::get_(null&) const { ok(PN_NULL); }
-#if PN_CPP_HAS_NULLPTR
 void scalar_base::get_(decltype(nullptr)&) const { ok(PN_NULL); }
-#endif
 
 namespace {
 
diff --git a/cpp/src/scalar_test.hpp b/cpp/src/scalar_test.hpp
index 4ed1e31..206a161 100644
--- a/cpp/src/scalar_test.hpp
+++ b/cpp/src/scalar_test.hpp
@@ -193,11 +193,8 @@ template <class V> void scalar_test_group(int& failed) {
     RUN_TEST(failed, (simple_integral_test<V, unsigned short>()));
     RUN_TEST(failed, (simple_integral_test<V, unsigned int>()));
     RUN_TEST(failed, (simple_integral_test<V, unsigned long>()));
-#if PN_CPP_HAS_LONG_LONG_TYPE
     RUN_TEST(failed, (simple_integral_test<V, long long>()));
     RUN_TEST(failed, (simple_integral_test<V, unsigned long long>()));
-#endif
-
 
     RUN_TEST(failed, (coerce_test<V>()));
     RUN_TEST(failed, (null_test<V>()));
diff --git a/cpp/src/test_bits.hpp b/cpp/src/test_bits.hpp
index 50ea2ee..92ecc83 100644
--- a/cpp/src/test_bits.hpp
+++ b/cpp/src/test_bits.hpp
@@ -154,7 +154,6 @@ template <class U, class V> std::ostream& operator<<(std::ostream& o, const std:
     return o << "( " << p.first << " , " << p.second << " )";
 }
 
-#if PN_CPP_HAS_CPP11
 template <class K, class T> std::ostream& operator<<(std::ostream& o, const std::unordered_map<K, T>& x) {
     return o << test::many<std::pair<const K, T> >(x);
 }
@@ -162,7 +161,7 @@ template <class K, class T> std::ostream& operator<<(std::ostream& o, const std:
 template <class T> std::ostream& operator<<(std::ostream& o, const std::forward_list<T>& s) {
     return o << test::many<T>(s);
 }
-#endif
+
 }
 
 #endif // TEST_BITS_HPP
diff --git a/cpp/src/timestamp.cpp b/cpp/src/timestamp.cpp
index 0e1cc96..03e7187 100644
--- a/cpp/src/timestamp.cpp
+++ b/cpp/src/timestamp.cpp
@@ -19,7 +19,6 @@
 
 #include "proton/timestamp.hpp"
 
-#include "proton/internal/config.hpp"
 #include <proton/error.hpp>
 #include <proton/proactor.h>
 #include <proton/types.h>
diff --git a/cpp/src/value.cpp b/cpp/src/value.cpp
index 45119ed..7a30cd3 100644
--- a/cpp/src/value.cpp
+++ b/cpp/src/value.cpp
@@ -36,10 +36,8 @@ using codec::start;
 value::value() {}
 value::value(pn_data_t *d) { data_ = make_wrapper(d); }
 value::value(const value& x) { *this = x; }
-#if PN_CPP_HAS_RVALUE_REFERENCES
 value::value(value&& x) { swap(*this, x); }
 value& value::operator=(value&& x) { swap(*this, x); return *this; }
-#endif
 
 value& value::operator=(const value& x) {
     if (this != &x) {
diff --git a/cpp/src/value_test.cpp b/cpp/src/value_test.cpp
index 2d991c4..086e58f 100644
--- a/cpp/src/value_test.cpp
+++ b/cpp/src/value_test.cpp
@@ -104,7 +104,6 @@ void null_test() {
     vm2[2] = n;
     ASSERT_EQUAL("{null=1, 2=null}", to_string(vm2));
 
-#if PN_CPP_HAS_CPP11
     proton::value nn = nullptr;
     ASSERT(n == nn);            // Don't use ASSERT_EQUAL, it will try to print
     ASSERT_EQUAL("null", to_string(nn));
@@ -114,7 +113,6 @@ void null_test() {
     ASSERT_EQUAL("{null=null}", to_string(m));
     std::map<proton::value, proton::value> m2 {{nullptr, nullptr}};
     ASSERT_EQUAL("{null=null}", to_string(m2));
-#endif
 }
 
 }
@@ -163,11 +161,10 @@ int main(int, char**) {
                               restricted_pairs, "{:a=0, :b=1, :c=2}")));
         RUN_TEST(failed, null_test());
 
-#if PN_CPP_HAS_CPP11
         RUN_TEST(failed, sequence_test<forward_list<binary> >(
                      ARRAY, many<binary>() + binary("xx") + binary("yy"), "@PN_BINARY[b\"xx\", b\"yy\"]"));
         RUN_TEST(failed, (map_test<unordered_map<string, uint64_t> >(si_pairs, "")));
-#endif
+
         return failed;
     } catch (const std::exception& e) {
         std::cout << "ERROR in main(): " << e.what() << std::endl;
diff --git a/cpp/src/work_queue.cpp b/cpp/src/work_queue.cpp
index bb6f4f1..4c29b2f 100644
--- a/cpp/src/work_queue.cpp
+++ b/cpp/src/work_queue.cpp
@@ -43,13 +43,11 @@ bool work_queue::add(internal::v03::work f) {
     return impl_->add(f);
 }
 
-#if PN_CPP_HAS_LAMBDAS && PN_CPP_HAS_VARIADIC_TEMPLATES
 bool work_queue::add(internal::v11::work f) {
     // If we have no actual work queue, then can't defer
     if (!impl_) return false;
     return impl_->add(f);
 }
-#endif
 
 bool work_queue::add(void_function0& f) {
     return add(make_work(&void_function0::operator(), &f));
@@ -61,13 +59,11 @@ void work_queue::schedule(duration d, internal::v03::work f) {
     return impl_->schedule(d, f);
 }
 
-#if PN_CPP_HAS_LAMBDAS && PN_CPP_HAS_VARIADIC_TEMPLATES
 void work_queue::schedule(duration d, internal::v11::work f) {
     // If we have no actual work queue, then can't defer
     if (!impl_) return;
     return impl_->schedule(d, f);
 }
-#endif
 
 void work_queue::schedule(duration d, void_function0& f) {
     schedule(d, make_work(&void_function0::operator(), &f));

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org